FFMPEG+SDL的一个简单视频播放器

一、什么是FFmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、解码,编码,转码,复用,解复用,过滤音视频数据等完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。

二、音视频文件播放流程:

视音频技术主要包含以下几点:封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。视频播放器播放一个视频文件,需要经过以下几个步骤:解协议,解封装,解码音视频,视音频同步基本流程图如下

解协议:音视频在网络上传播的时候,常常采用各种流媒体协议,解协议的作用就是将流媒体协议的数据例如HTTP,RTMP,解析为标准的相应的封装格式数据。

解封装:将输入的封装格式的数据例如MP4,TS,FLV,AVI等分离成为音频流压缩编码数据和视频流压缩编码数据。

解码:将视频/音频压缩编码数据(音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,),解码成为非压缩的视频/音频原始数据,例如YUV420P、RGB、PCM数据。

视音频同步:同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

三、FFmpeg的一些核心结构体

AVFormatContext:解封装功能的结构体,包含文件名、音视频流、时长、比特率等信息;

AVCodecContext:编解码器上下文,编码和解码时必须用到的结构体,包含编解码器类型、视频宽高、音频通道数和采样率等信息;

AVCodec:存储编解码器信息的结构体;

AVStream:存储音频或视频流信息的结构体;

AVPacket:存储音频或视频编码数据;

AVFrame:存储音频或视频解码数据(原始数据)

四、使用FFmpeg播放视频流程

五、ffmpeg的一些主要API:

1. 注册所有容器格式和解码器: av_register_all()

2. 打开输入文件,解封装: av_open_input_file()

3. 从文件中获取音视频流信息: av_find_stream_info()

4. 遍历所有类型的流(音频流、视频流、字幕流),找到视频流。

5.获取视频流中的编解码上下文AVCodecContext,只有知道视频的编码方式,才能够根据编码方式去找到解码器。

6.根据编解码上下文中的编码id查找对应的解码器: avcodec_find_diecoder()

7. 打开编解码器: avcodec_open2()

8. 不停地从码流中提取中帧数据: av_read_frame()

9. 判断帧的类型,对于视频帧进行解码: avcodec_decode_video2()

10.对解码后的数据进行像素格式和分辨率的转换sws_scale()

10.此时得到的的数据为解码后的原始数据如YUV,RGB,PCM等,可以使用fwrite()输出到fill中,或者申请一个缓存区outBuffer(自己申请的目标格式一帧缓存区),暂存data。

11. 解码完后,释放解码器: avcodec_close()

12. 关闭输入文件:av_close_input_file()

六、使用SDL输出视频流至屏幕

SDL是一套开放源代码的跨平台多媒体开发库。SDL提供了数种控制图像、声音、输出入的函数。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

ffmpeg是用于视频编解码,而SDL是将解码后的音视频数据进行播放的。FFmpeg+SDL实现了一个简单的视频播放器。

七、SDL函数说明:

SDL_Init(); //初始化接口,根据需要选择适当的参数

SDL CreateWindow(); //创建播放窗口

SDL_ CreateRenderer() ; //创建渲染器

SDL_ CreateTexture(); //创建纹理

SDL_ UpdateTexture(); //更新纹理参数

SDL_ RenderClear(); //清除上一帧渲染

SDL_ RenderCopy(); //复制渲染器

SDL_ RenderCopy(); //对当前帧进行渲染

八、简单解释各个变量的作用:

SDL_Window就是使用SDL的时候弹出的播放窗口。

SDL_Texture用于YUV的纹理数据显示的区域。一个SDL_Texture对应一帧YUV数据。

SDL_Renderer用于渲染SDL_Texture纹理至SDL_Window播放窗口。

SDL_Rect用于确定SDL_Texture显示的位置区域。注意:一个SDL_Texture可以指定多个不同的SDL_Rect,这样就可以在SDL_Window不同位置显示相同的内容(使用SDL_RenderCopy()函数)。

它们的关系如下图所示:

渲染流程:

原文 FFMPEG+SDL的一个简单视频播放器 - 知乎 

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/132070611