APP下载

基于FFmpeg 和SDL 的视频流播放存储研究综述

2019-09-06邓正良

现代计算机 2019年22期
关键词:视频流音视频解码

邓正良

(广东粤电阳江海上风电有限公司,阳江529500)

0 引言

在当今的互联网时代,随着网络视频的兴起与流媒体通信技术的不断提高、完善,多媒体数据传输成为了日常生活中不可或缺的一部分。网络视频传输依靠其快捷、即时和分享性等优势,已经成为当今环境下的主宰,越来越多的平台需要凭借网络视频传输实现其功能,例如视频直播、在线观影和周界安防监控等[1]。不同的视频服务提供商使用不同类型的传输协议、媒体容器格式以及音视频编解码标准。传输方式包括HTTP、RTMP、RTSP 等多种媒体传输协议[2];媒体容器格式包括FLV、MP4、AVI、TS、RMVB 等;视频编码标准[3]包括H.264、H.265、MPEG4、MPEG2 等[4]。为了能够支持不同的传输协议、媒体容器格式以及音视频编解码标准,市场上一般常用FFmpeg 和SDL 作为主要的工具库实现视频播放的功能。FFmpeg[5]作为一个开放的多媒体框架,支持多种传输协议、媒体容器格式以及音视频编解码标准,能够通过其封装的数据结构来存储从多媒体数据中提取的信息,有效解决视频数据的编解码;SDL[6]全称为Simple DirectMedia Layer,它作为一套开源应用工具开发库,依靠其简洁的接口能够支持音视频、事件、绘图等功能,应用于游戏研发、多媒体影像、图像处理等领域。基于FFmpeg 和SDL 工具库,能够实现高效地实现视频流播放存储。

1 FFmpeg解码技术

1.1 FFmpeg数据结构

FFmpeg 结构体功能概述[7]如下:

(1)AVFormatContext:作为输入、输出相关信息的一个容器,封装了格式上下文结构体,对相关视频文件的封装格式信息进行存储。

(2)AVPacket:在读媒体源文件和写输出文件时都需要用于存储每一帧压缩编码后的视频数据。

(3)AVFrame:存储每一帧解码后的采样数据。

(4)AVStream:音视频流与对该结构体对应。

(5)AVInputForma:封装格式与该结构体对应。

(6)AVCodecContext:它作为编码器关联结构,对视音视频编解码相关信息进行了存储。

(7)AVCodec:音视频编解码器与该结构体对应。

上述结构体[8]之间的关系如图1 所示。

图1 FFmpeg结构体间的关系

1.2 FFmpeg常用函数

在利用FFmpeg 进行解码的过程中,主要会用到以下相关函数:

(1)av_register_all():全注册函数,该函数的作用是初始化工具库。

(2)avformat_open_input():输入源打开函数,该函数的作用是打开输入视频文件。

(3)avformat_find_stream_info():流找寻函数,该函数的作用是获取视频信息,视频数据包含了媒体数据中的流信息。

(4)av_find_decoder():编解码器找寻函数,该函数的作用是查找解码器,包含了id 和encoder 这两个参数。

(5)avcodec_open2():解码器打开函数,该函数的作用是打开解码器,初始化AVCodecContext 结构。

(6)av_read_frame():帧数读取函数,该函数的作用是将编码数据从输入数据中读取出来。

(7)avcodec_decode_video2():视频解码函数,该函数的功能是解码压缩数据。解码视频流数据包结构体,调用上述提及的帧数读取函数获取流,并判断其是否为视频流,若为视频流则执行解码操作。

1.3 FFmpeg解码模块

FFmpeg 解码包含了主要的三个解码模块[9],分别为解码协议模块、解码格式模块和解码视频和音频模块。

(1)解码协议模块

媒体流输入协议数据的协议类型和状态(例如HTTP、RTMP、RTSP 等类型的传输协议)均被存储于AVIOContext、URLProtocol 和URLContext 中,但由于上述协议中存在对媒体流进行控制的信令数据,该数据会对输入协议数据产生影响,所以要将其抹去。解码协议模块的功能是对输入数据进行过滤,剔除协议信令数据,将包含协议信息的输入数据转换为媒体容器格式数据。

(2)解码格式模块

剔除协议信令数据并完成协议解码的媒体容器格式数据包含了音视频两部分数据,解码格式模块的作用就是对媒体容器格式数据进行拆分,独立出音频编码数据和视频编码数据这两部分,并将解码后的两部分数据分别放入特定格式的文件中。

该模块主要与AVFormatContext 和AVInputFormat结构体相关,AVFormatContext 存储包含在媒体容器格式中的信息;AVInputFormat 存储输入媒体流媒体容器格式的类型。

(3)解码音视频模块

经由格式解码拆分独立的音视频两部分数据,仍需要进行进一步操作才能得到未压缩的数据。解码视频和音频模块的作用就是将视频编码数据和音频编码数据分别解码为未经压缩的视频和音频原始数据。经过解码处理后的视频数据被转换为未压缩的像素数据,而音频数据被转换为未压缩的音频采样数据。

该模块主要与AVStream、AVCodecContext 和AVCodec 结构体相关,AVStream 存储了音频和视频流信息;AVStream 存储了AVCodecContext,用于保存音视频流解码信息;AVCodecContext 存储了AVCodec,用于保存音视频频解码器信息。

2 SDL显示技术

2.1 SDL数据结构

(1)SDL_Window:该结构表示“窗口”。

(2)SDL_Renderer:该结构表示“渲染器”。

(3)SDL_Texture:该结构表示“纹理”。

(4)SDL_Rect:该结构表示“矩形结构”。

基于SDL 数据结构,视频显示原理如图2 所示。

图2 视频显示原理

2.2 SDL显示常用函数

SDL 主要通过以下八个函数实现显示操作:

(1)SDL_Init():系统初始化函数,该函数对整个系统进行初始化操作。

(2)SDL_CreateWindow():窗口创建函数,该函数创建了窗口SDL_Window 结构体变量。它的主要作用是分别是为SDL_Window 结构体分配内存、设置窗口的宽高与坐标位置以及创建窗口。

(3)SDL_CreateRenderer():渲染器创建函数,该函数创建了渲染器结构体变量。

(4)SDL_CreateTexture():纹理创建函数,该函数创建了纹理SDL_Texture 结构体变量。它的主要作用分别是检查输入参数合理性、为SDL_Texture 纹理结构分配内存以及创建纹理。

(5)SDL_UpdateTexture():纹理更新函数,该函数主要提供四部分功能,分别是设置相关纹理数据、检查输入参数合理性、处理特殊格式以及更新纹理。

(6)SDL_RendererCopy():渲染拷贝函数,该函数的功能是把纹理数据复制给渲染器,主要完成检查输入参数合理性以及复制纹理给渲染对象这两部分操作。

(7)SDL_RendererPresent():渲染显示函数,该函数的功能是显示已复制给渲染对象的图像。

(8)SDL_Quit():系统退出函数,该函数的作用是退出SDL 系统,释放相关占用资源。

3 视频流播放存储

基于FFmpeg 和SDL 的视频流播放存储的实现方式如图3 所示[10]。

视频流播放的实现步骤主要分为取流、解码和显示三部分组成。

(1)视频流播放

①读取视频流地址的配置文件信息,根据配置信息从流地址中读取实时视频的数据。

②通过FFmpeg 初始化,获取媒体源后,寻找视频流的相关信息,寻找解码器,并打开解码器,读取视频帧,判断是否获取到数据包,存储压缩编码的数据,解码每一帧视频数据后,再存储每一帧解码后的数据,回到解码器进行下一帧的处理,直到无法获取到数据包为止。

③通过SDL 创建窗口,渲染器和纹理,将一帧帧解码后的视频贴图显示,实现视频的播放。

(2)视频流存储

视频流存储的实现步骤主要分为创建、取流、读帧和存储四部分组成。

①指定扩展名,输入存储文件的名称,创建文件进行保存,若视频文件名称已存在,提示是否覆盖。

②读取视频流地址的配置文件信息,根据配置信息从流地址中读取实时视频的数据。

③通过FFmpeg 初始化用于输出结构体,为视频流创建Stream 通道。获取媒体源后,寻找视频流的相关信息,寻找并打开解码器。地址的打开方式选择读写状态,调用头函数创建函数完成视频文件头的写入。循环读取并存储每一帧数据,判断是否获取到数据包。

④通过写视频文件尾,关闭上下文结构体,释放输出结构体,完成视频存储。

图3 视频流播放存储过程

4 结语

本文介绍了基于FFmpeg 和SDL 工具库,实现视频流播放的方式,阐述FFmpeg 与SDL 的常用函数及各结构体间的关系,并给出视频流播放存储的实现过程。在实际应用中,可以根据支持的不同种传输协议、媒体容器格式和音视频编解码标准,调整码率、帧数,实现不同需求的实时视频流播放存储,提高在不同情况下的媒体流播放效果。

猜你喜欢

视频流音视频解码
基于连续细节特征分解的数据并行聚类挖掘
Microchip推出首款车载以太网音视频桥接(AVB)全集成解决方案
聚焦“5G+音视频”融合发展 2019中国音视频产业大会深圳举办
文化解码
解码eUCP2.0
文化 解码
文明 解码
那些光辉岁月里的诗章
——向建国70周年献礼全国首届《散文诗》作品音视频作品再创作征集启事
铁路货场智能大门集装箱全景图像采集方法研究
基于视频流的图像识别技术发展与应用