视频播放音画同步处理

一、视频播放流程

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

解复用(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.将视频和音频同步到外部的时钟上:选择一个外部时钟为基准,视频和音频的播放速度均以该时钟为标准。

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

相关推荐
darkdragonking10 小时前
FLV视频封装格式详解
音视频
元争栈道11 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
元争栈道12 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MediaTea16 小时前
Pr:音频仪表
音视频
桃园码工16 小时前
13_HTML5 Audio(音频) --[HTML5 API 学习之旅]
音视频·html5·audio
cuijiecheng20181 天前
音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现
ffmpeg·音视频
γ..1 天前
基于MATLAB的图像增强
开发语言·深度学习·神经网络·学习·机器学习·matlab·音视频
cuijiecheng20181 天前
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
ffmpeg·音视频·aac
悟纤1 天前
Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇
音视频·suno·suno v4·suno ai
gomogomono1 天前
HDR视频技术之八:色域映射
音视频·hdr·yuv