FFmpeg入门 - 视频播放

本文介绍了FFmpeg的基础知识,并提供了一个简单的视频播放器的入门教程。内容包括音视频编解码基础,ffmpeg的解析文件流、创建解码器、解码视频流的步骤,以及视频解码过程中的关键函数和注意事项,如PTS同步、内存管理和帧类型问题。通过示例代码展示如何使用ffmpeg解码视频并播放画面。
摘要由CSDN通过智能技术生成

1、音视频编解码基础


我们可以通过http、rtmp或者本地的视频文件去播放视频。这里的"视频"实际上指的是mp4、avi这种既有音频也有视频的文件格式。

这样的视频文件可能会有多条轨道例如视频轨道、音频轨道、字幕轨道等. 有些格式限制比较多,例如AVI视频轨道只能有一条,音频轨道也只能有一条. 而有些格式则比较灵活,例如OGG视频的视频、音频轨道都能有多条.

像音频、视频这种数据量很大的轨道,上面的数据实际上都是通过压缩的。 视频轨道上可能是H264、H256这样压缩过的图像数据,通过解码可以还原成YUV、RGB等格式的图像数据。 音频轨道上可能是MP3、AAC这样压缩过的的音频数据,通过解码可以还原成PCM的音频裸流。

截屏2022-09-04 下午1.47.57.png

实际上使用ffmpeg去播放视频也就是根据文件的格式一步步还原出图像数据交给显示设备显示、还原出音频数据交给音频设备播放:

截屏2022-09-04 下午1.48.08.png

2、ffmpeg简单入门


了解了视频的播放流程之后我们来做一个简单的播放器实际入门一下ffmpeg。由于这篇博客是入门教程,这个播放器功能会进行简化:

  1. 使用ffmpeg 4.4.2版本 - 4.x的版本被使用的比较广泛,而且最新的5.x版本资料比较少

  1. 只解码一个视频轨道的画面进行播放 - 不需要考虑音视频同步的问题

  1. 使用SDL2在主线程解码 - 不需要考虑多线程同步问题

  1. 使用源码+Makefile构建 - 在MAC和Ubuntu上验证过,Windows的同学需要自己创建下vs的工程了

使用ffmpeg去解码大概有下面的几个步骤和关键函数,大家可以和上面的流程图对应一下:

2.1 解析文件流(解协议和解封装)

  1. avformat_open_input : 可以打开File、RTMP等协议的数据流,并且读取文件头解析出视频信息,如解析出各个轨道和时长等

  1. avformat_find_stream_info : 对于没有文件头的格式如MPEG或者H264裸流等,可以通过这个函数解析前几帧得到视频的信息

2.2 创建各个轨道的解码器(分流)

  1. avcodec_find_decoder: 查找对应的解码器

  1. avcodec_alloc_context3: 创建解码器上下文

  1. avcodec_parameters_to_context: 设置解码所需要的参数

  1. avcodec_open2: 打开解码器

2.3使用对应的解码器解码各个轨道(解码)

  1. av_read_frame: 从视频流读取视频数据包

  1. avcodec_send_packet: 发送视频数据包给解码器解码

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值