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)以及音视频学习路线图等等。

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

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ffmpeg sdl是一种基于ffmpegsdl库开发的视频播放器ffmpeg一个开源的跨平台音视频解决方案,支持包括视频采集、编码、解码、转码、播放等功能,被广泛应用于视频处理和视频播放领域。而sdl是一种跨平台开放源代码的多媒体库,提供了音频、视频、事件等处理功能,它是一个适合于游戏和媒体应用的库。 ffmpeg sdl视频播放器利用ffmpeg库解码文件,将视频数据解码成RGB格式的图片数据,然后使用sdl库将图片数据渲染到屏幕上。通过这种方式,可以实现基于CPU的视频播放。 ffmpeg sdl视频播放器具有以下特性: 1. 支持多种视频格式:ffmpeg支持的视频格式非常丰富,几乎可以处理所有常见的视频格式,例如MP4、AVI、FLV等。因此,ffmpeg sdl视频播放器可以播放多种格式的视频。 2. 良好的兼容性:ffmpeg sdl视频播放器可以运行在多个平台上,例如Windows、Linux、Android等平台。 3. 可扩展性强:ffmpegsdl都是开源的项目,可以方便地进行开发和扩展。同时,ffmpeg sdl视频播放器还支持自定义音频和视频渲染。 4. 轻量级:ffmpeg sdl视频播放器采用的是CPU进行解码,因此不需要额外的硬件加速。同时,ffmpegsdl都是轻量级的库,不会占用过多的系统资源。 总之,ffmpeg sdl视频播放器是一种非常方便的视频播放解决方案,具有兼容性强、支持视频格式多、可扩展性强等优点。它可以为视频处理和视频播放提供极佳的支持,并且可以适用于多种平台和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值