视频播放音画同步处理

一、视频播放流程

播放一个视频,一般分一下几步完成

解复用(Demux):在媒体文件中将音频数据、视频数据、字母数据分离出来。

二、播放参数说明

视频帧率:一秒钟需要显示的画面,比如25FPS,意思就是一秒钟需要显示25张画面,

那么一张画面的持续时间就是1000/25=40ms。

音频采样率:一秒钟播放的样品个数。

音频数据公式:采样率x通道数*采样深度/8*数据持续时间。

三、音画同步阐述

依据视频帧率以及音频的帧率即可控制播放速度。声卡和显卡均是一帧数据来作为播放单位,如果单纯依据帧率来控制播放,理论上是可以控制音画同步的。

比如深度16bit,一个8K单声道的PCM的数据和25FPS的视频流为例:

一个512byte的PCM音频帧的播放时长:512*1000/(8000*16/2)=32ms

一帧视频画面的持续时间为1000/25 = 40ms

故在理想情况下,音视频完全不同,音视频播放过程如下:

但是实际情况下,如果用上面这种方式的话,慢慢的就会出现音视频不同步的情况,可能是视频播放快了,可能音频播放快了。原因如下:

1.一帧的播放时间,难以精准控制。音视频解码及渲染的耗时不同,可能造成每一帧输出的时间长短不一样,长久积累误差,不同步便会越来越明显。

2.音频数据输出是线性的持续不断的,但是视频输出不是线性的,视频渲染可能快,可能慢,从而导致音视频显示帧率上出现偏差。

所以,解决音视频播放同步的问题,引入了时间戳。

录制的时候:选择一个参考时钟,要求参考时钟上的时间是线性递增的,编码时依据参考时钟上的每个音视频数据块打上时间戳。

播放的时候:依据音视频时间戳及参考时钟,来调整播放速度。

所以,视频和音频同步实际上时一个动态的过程,一直围绕理想状态上不断调整音视频播放速度,来消除时间累计误差。

四、同步策略

实现 音视频同步,在播放时候需要选择一个参考时钟,读取帧上的时间戳,同时根据参考时钟来动态调整播放速度。参考时钟一般选择以下两种

1.将视频同步到音频上:以音频的播放速度为基准来同步视频。

2.将视频和音频同步到外部的时钟上:选择一个外部时钟为基准,视频和音频的播放速度均以该时钟为标准。

当播放源比参考时钟慢时,加快播放速度或者丢弃,播放快了则延迟播放速度。考虑人对声音的敏感度比较高,频繁调节音频会带来较差的体验,并且音频播放时钟为线性增长,一般的做法都是以时钟作为参考时钟,将视频同步到音频上。

相关推荐
愚公搬代码14 小时前
【愚公系列】《剪映+DeepSeek+即梦:短视频制作》018-特效:轻松提升视频质感(知识拓展:轴线原则)
人工智能·音视频
wefly201718 小时前
告别本地环境!m3u8live.cn一键实现 M3U8 链接预览与调试
前端·后端·python·音视频·m3u8·前端开发工具
却道天凉_好个秋19 小时前
音视频学习(九十七):自适应码率(ABR)
学习·音视频·abr
foenix6620 小时前
我的第一个 Vibe Coding 项目:我做了一个能自动剪视频、写字幕、配音、生成文案的 AI 工作流
人工智能·音视频
却道天凉_好个秋20 小时前
音视频学习(九十六):PLC
学习·音视频·plc
软件资深者20 小时前
MTools开源工具箱12-beta使用教程 音视频/图片/文本/编码全能处理 免安装无广告
音视频
却道天凉_好个秋1 天前
音视频学习(九十五):FEC
学习·音视频·fec
愚公搬代码1 天前
【愚公系列】《剪映+DeepSeek+即梦:短视频制作》019-声音:让短视频更加动听(添加音乐、音效和录音)
音视频
wefly20171 天前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
却道天凉_好个秋2 天前
音视频学习(九十四):NACK和RTX
音视频·nack·rtcp·rtx