FFMPEG开发快速入坑——附录一:音视频同步

这篇具有很好参考价值的文章主要介绍了FFMPEG开发快速入坑——附录一:音视频同步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章节主要以本地音视频播放为例,简要描述讲解一个基本的播放器中,音视频播放如何实现同步的。

一、通用媒体播放框架

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

通用媒体播放器框架

其中各个组件模块:

1、Media Demux: 进行媒体文件的解析,分别解析出音频流数据包和视频流数据包。主要使用 libavformat库中的函数。

2、Video Decoder:视频解码器,解码后的视频帧放入到帧队列,主要使用libavcodec库中的函数。

3、Audio Decoder:音频解码器,解码后的PCM数据放入缓存队列,主要使用libavcodec库中的函数。

4、Video Post-process:视频帧后处理,通常是进行色彩格式转换、大小缩放、特效等处理,主要使用libswscale库中的函数

5、Audio Post-process:音频帧后处理,通常是重采样、均衡器、变声等处理,主要使用libswresample库中的函数。

6、Video Display:视频帧显示,正常播放时直接显示到界面控件。这个是跟平台相关的处理,通常使用 OpenGL进行视频帧渲染,包括一些特效处理。

7、Audio Render:音频设备输出,通常的音频设置输出每播放完一段会有相应的回调通知。这个是跟平台相关的处理,需要调用系统平台支持的一些API进行音频输出,如果要跨平台处理,可以考虑使用 OpenSL接口(前提是平台支持)

另外:

(1)音视频同步控制(AV Sync Control)通常都是在音视频数据解码后进行同步控制。

(2)很多时候,视频后处理(Video Post Process) 和 视频显示(Video Display) 模块可以集中在一个模块中,直接在GPU中进行处理。

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

音视频流播放时序

1、视频播放时,以30FPS帧率为例,一帧视频帧平均显示33ms,这个时间包括从码流解析、解码、后处理 到显示整个过程处理时间要 < 33ms。

2、音频播放时,通常音频设备每次送入一段PCM数据进行播放,播放完成后设备回调通知送入下一段PCM数据,从而形成连续播放效果。 PCM数据字节数与播放时长线性相关。

3、音频的播放是线性顺序的,整体播放过程是流畅的;而 视频帧的播放受限于解析、解码、后处理等过程时快时慢,为了配合音频,要进行控制处理。

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

二、视频帧同步信息

1、视频帧的类型

I 帧(Intra coded frames): 关键帧,使用帧内压缩,不使用运动补偿,不依赖其它帧,可以独立解码。

P 帧(Predicted frames): 采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P 帧图像中可以包含帧内编码的部分,即 P 帧中的每一个宏块可以是前向预测,也可以是帧内编码。P帧解码依赖于前面的I帧或者P帧。

B 帧(Bi-directional predicted frames): 采用帧间编码方式,且采用双向时间预测,可以大大提高压缩倍数。也就是其在时间相关性上,还依赖后面的视频帧,也正是由于 B 帧图像采用了后面的帧作为参考,因此造成视频帧的传输顺序和显示顺序是不同的。B帧解码既要依赖于前面的P帧或I帧,还依赖于其之后的P帧。

2、图像组(GOP:Group of picture)和 参考周期(Reference)

GOP: 指两个关键帧(I帧)之间的距离。

Reference :指两个P帧之间的距离。

在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。 需要说明的是,通过提高GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

3、视频帧的时间戳

编码器在对视频帧编码处理时,每一帧视频帧都附带 DTS 和 PTS 两个时间戳信息,以及一个Duration显示时长信息。

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。

PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

Duration: 当前视频帧显示时长。以30FPS帧率为例,显示时长为33ms

当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了,即视频输出是非线性的。

4、视频帧解码顺序

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

I frame 的解码不依赖于任何的其它的帧.

而 P frame的解码则依赖于其前面的I frame或者P frame.

B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame

三、音频帧同步信息

每一帧音频帧也有PTS和DTS时间戳。对于音频数据,当其通道数、采样位数、采样率固定后,其对应的播放时长和字节数是线性对应的,1秒的音频时长总计需要PCM字节数:

采样率 * 通道数 * (采样位数/8)

以双声道、16位数据、44.1KHz采样率的音频为例, 1秒音频时长需要字节数:

44100 * 2 *(16/2)=172.27KB

根据这个公式,可以根据PCM的字节数来计算整个播放时长。

音频输出设备在播放时,通常是一段一段的送入PCM数据,当一段PCM数据播放完成后,音频设备总是通过回调通知送入下一段PCM数据,在回调时通常会附带播放时间戳信息,可以根据这个信息更新音频播放时长。

四、音视频同步算法

1、基本同步策略

(1)以视频帧播放速度为基准,将音频播放同步到视频播放时间上

(2)以音频的播放速度为基准,将视频播放同步到音频上

(3)使用一个统一的全局时钟为基准,视频和音频的播放速度都以该时钟为标准

考虑到人对声音的敏感度要强于视频,频繁调节音频会带来较差的观感体验,且音频的播放时钟为线性增长,所以通常不会采用第一种策略,而是采用第二或第三种策略,或者将两者策略混合进行。

2、全局时钟和音频时钟的处理

(1)使用一个全局的系统时钟,自动增加时钟。

(2)音频数据通常每段播放200ms左右的PCM数据,播放完成后设备回调通知播放下一段数据,同时将播放时间戳信息回调上来,根据已经播放的时间戳来累加统计音频播放的精准时间。同时将音频时钟 更新到全局系统时钟上。

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

3、视频帧的处理

解码后的视频帧的显示会根据当前视频帧PTS和基准时钟来控制显示:

(1)当前视频帧的PTS >= 基准时钟: (视频帧解码处理很快,这种情况极少)

直接延长当前视频帧的显示时间即可。

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

(2)当前视频帧的PTS < 基准时钟 < 下一GOP开始时间点:

当前视频帧解码后直接丢弃,开始解码后续帧,一直解码到与全局时钟平齐的视频帧 。如果GOP中帧数比较大,当前PTS与全局时钟差距也比较大,这里的连续解码也会消耗过多的时间。这种情况下性能优先(质量可降低)时,可以快速跳转到平齐的P或B帧解码,但是这种情况下大概率会出现马赛克,直到下一个GOP才可以规避马赛克。

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

(3)当前视频帧的PTS <下一GOP开始时间点 < 基准时钟 :

找到全局时钟对应的GOP,从I帧开始开始依次解码,一直解码到与全局时钟平齐的视频帧。如果GOP中帧数比较大,当前PTS与全局时钟差距也比较大,这里的连续解码也会消耗过多的时间。这种情况下性能优先(质量可降低)时,可以快速跳转到平齐的P或B帧解码,但是这种情况下大概率会出现马赛克,直到下一个GOP才可以规避马赛克。

FFMPEG开发快速入坑——附录一:音视频同步,ffmpeg,音视频

五、总结

媒体播放器在播放时的处理逻辑:

1、音频帧正常顺序播放,音频播放时间作为基准时钟

2、视频帧在解码后,根据基准时钟来调整当前处理:

(2.1)视频帧PTS > 基准时钟: 根据时间差异计算视频帧显示延时

(2.2)视频帧PTS < 基准时钟 < 下一GOP点:丢弃当前帧,直接依次解码后续帧

(2.3)视频帧PTS < 下一GOP点 < 基准时钟:直接调整到下一GOP开始I帧,依次解码

原文链接  FFMPEG开发快速入坑——附录一:音视频同步 - 知乎 文章来源地址https://www.toymoban.com/news/detail-804018.html

到了这里,关于FFMPEG开发快速入坑——附录一:音视频同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 玩赚音视频开发高阶技术——FFmpeg

    随着移动互联网的普及,人们对音视频内容的需求也不断增加。无论是社交媒体平台、电商平台还是在线教育,都离不开音视频的应用。这就为音视频开发人员提供了广阔的就业机会。根据这些年来网站上的音视频开发招聘需求来看,音视频开发人员的需求量大,且薪资待遇

    2024年02月13日
    浏览(67)
  • Qt音视频开发38-ffmpeg视频暂停录制的设计

    基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件

    2023年04月20日
    浏览(75)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(87)
  • 音视频开发实战03-FFmpeg命令行工具移植

    作为一个音视频开发者,在日常工作中经常会使用ffmpeg 命令来做很多事比如转码 ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 ,水平翻转视频: ffmpeg -i src.mp4 -vf hflip -acodec copy -vcodec h264 -b 22000000 out.mp4 ,视频截取: ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 ou

    2024年02月16日
    浏览(78)
  • Qt/C++音视频开发46-音视频同步保存到MP4

    用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可。最难的是在播放过程中不断随机的切换播放进度,而且还会暂停播放、暂停录制的情况出现,这

    2024年02月17日
    浏览(71)
  • 音视频开发三:Windows环境下FFmpeg编译安装

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的 开源计算机程序 。采用LGPL或GPL许可证 。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环

    2024年02月04日
    浏览(70)
  • Qt音视频开发40-ffmpeg采集桌面并录制

    之前用ffmpeg打通了各种视频文件和视频流以及本地摄像头设备的采集,近期有个客户需求要求将整个桌面屏幕采集下来,并可以录制保存成MP4文件,以前也遇到过类似的需求,由于没有搞过,也没有精力去摸索和测试,所以也就一直耽搁着,近期刚好这个需求又来了,定下心

    2023年04月25日
    浏览(65)
  • 音视频开发五:visual studio集成使用FFmpeg

    ffmpeg 官网 - download - 选择Windows系统 - 选择gyan.dev版本- shared版本 在Windows系统上,Gyan.dev和BtbN都提供了FFmpeg的预编译版本。Gyan.dev通常使用MSVC编译器,而BtbN使用MinGW编译器。因此,Gyan.dev的版本可能会更符合Windows标准,而BtbN的版本可能会更加开放和跨平台。 选择 shared版本 各

    2024年02月04日
    浏览(63)
  • 音视频开发:ffplay使用ffmpeg滤镜实现倍速播放

    曾经为实现倍速播放使用过ffmpeg,对音频使用atempo滤镜即可实现变速不变调。但是当时效果并不是特别好,和soundtouch相比处理后的音质有明显的区别。最近用新版本的ffmpeg滤镜重新实现了倍速播放,发现效果变好,已经达到可接受的程度,所以在此分享具体实现。 ffmpeg倍速

    2024年02月03日
    浏览(110)
  • 【音视频开发】FFmpeg转换与封装 I - MP4格式

    1 FFmpeg转换与封装 1.1 MP4格式转换 1.1.1 MP4格式标准         FFmpeg支持的媒体封装格式具有多样性与全面性,与此, 我们还可以使用FFmpeg来对媒体格式进行转换与封装 。 在互联网常见的格式中,跨平台最好的应该是 MP4 文件,因为 MP4 文件既可以在PC 平台的Flashplayer中播放,

    2024年02月08日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包