音视频同步(播放)原理
每一帧音频或视频都有一个持续时间:duration:
采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。
。正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。常用的音频采样频率有8kHz、
11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采样频率,还可以达到DVD的音质
对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。
背景知识:
(一个AAC原始帧包含一段时间内1024个采样及相关数据)
分析:
1) AAC
音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)
一帧 1024个 sample。采样率 Samplerate 44100KHz,每秒44100个sample, 所以根据公式 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率
当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)
2) MP3
mp3 每帧均为1152个字节, 则:
frame_duration = 1152 * 1000000 / sample_rate
例如:sample_rate = 44100HZ时,计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。
3)H264
视频的播放时间跟帧率有关 frame_duration = 1000/fps
例如:fps = 25.00 ,计算出来的时常为40ms,这就是同行所说的40ms一帧视频数据。
理论上的音视频(播放)同步是这样的:
由此得到了每一帧数据的持续时间,音视频交叉存储在容器中:一个时间轴:
时间轴:0 22.32 40 44.62 66.96 80 89.16 111.48 120 ................
音 频 :0 22.32 44.62 66.96 89.16 111.48 ................
视 频 :0 40 80 120 ................
即视频的持续时间相加 和音频的持续时间相加作比较,谁小写入哪个。
但实际情况(播放)是不成立的
1:首先解决一个问题
为什么不 音频播音频的 视频播视频的 即上面的 到 第22.32ms播一帧音频 ,到40ms播一帧视频。
因为这个22.32ms 或40ms是算不准的或者说和声卡播的时间是不一样的。这里就需要知道声卡播一帧/或者说播放一个buf音频需要多长时间。
2:声卡每次播一个采样点 而不是一帧。声音当一个采样点丢失了都可以听出来,视频则不然。
3:音视频同步方式:1----回调方式
假设声卡有两块缓存都是存放要播放的声音pcm的 一直在播放"B"buf 首先确定几点
(1)buf大小是固定的这样播放一个buf的时间就是固定的,假设30ms;
(2)当buf“B”播放完毕即buf用完,再播放buf“A",保证音频pcm一直都连续
(3)当一个buf播放完毕,那说明系统(声卡)过了30ms, 这时候有可能真正的时间过了40ms(这里不用关心),这里则通过回调得到一次时间30ms;
(4)再去用视频对应音频的30ms,这时候的时间就是准确的:
时间轴:0 30 60 90 120 ................
音 频 :0 22.32 44.62 66.96 89.16 111.48 ................
视 频 :0 40 80 120 ................
(5)这里有个问题就是 视频中 30ms 到40ms 这中间的10ms是怎么算出来的,这个是不用关心的,因为人的眼睛10ms是看不出来的,
即当音频的30ms一次回调时,就可以播放第二帧视频,如上图
第一次回调(30ms)---播(40ms)视频,
第一次回调(60ms)---播(80ms)视频,
第一次回调(90ms)---不播视频,
第一次回调(120ms)---播(120ms)视频。
4:音视频同步方式:1----阻塞方式
还是看上面的图
(1)buf"B"一直在播放,传入buf"A"的外部buf把数据给buf"A"后 不立即返回,等到buf"B"播放完成再返回,
这时从传入到经过阻塞出来就是一个buf的时间例如上面的30ms。
(2)然后buf"A"一直在播放,传入buf"B"的外部buf把数据给buf"B"后 不立即返回,等到buf"A"播放完成再返回,
这时从传入到经过阻塞出来就是一个buf的时间例如上面的30ms。
(3)循环上面(1)(2),即得到了如回调方式同样的那个30ms时间。下面和回调方式一样,见回调方式(4)(5)。
音视频同步(播放)原理相关推荐
- 视频、音频打时间戳的方法及其音视频同步(播放)原理
https://blog.csdn.net/nine_locks/article/details/48007055
- ffmpeg播放器 android,Android使用FFmpeg(六)--ffmpeg实现音视频同步播放
关于 准备工作 正文 依旧依照流程图来逐步实现同步播放: 从流程图可以看出,实现同步播放需要三个线程,一个开启解码的装置得到packet线程,然后分别是播放音频和视频的线程.这篇简书是以音频播放为基准 ...
- FFmpeg基础:音视频同步播放
文章目录 定义全局数据类 定义数据队列 定义SDL库初始化操作 定义音视频流解析函数 定义解封装线程和视频解码线程 定义音视频的解码函数 主函数事件响应 视频文件解复用之后视频流和音频流是独立的,也是 ...
- ffmpeg java 播放视频_Javacv使用ffmpeg实现音视频同步播放
最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放.采用的同步方法是视频向音频同步. 具体的思路如下: (1)首先介绍ffmpeg是 ...
- Android FFmpeg系列——5 音视频同步播放
https://blog.csdn.net/JohanMan/article/details/83176144
- 基于FFmpeg和Android的音视频同步播放实现
https://blog.csdn.net/ericbar/article/details/80785764 https://blog.csdn.net/AndroidAlvin/article/de ...
- FFmpeg 音视频同步
原地址:http://www.jianshu.com/p/27279255f67e 音视频播放器的工作的具体流程如下图所示: 播放器工作流程 简单的来说包括:解协议,解封装,对音频和视频分别进行解码, ...
- 视频【解码】原理(播放器原理),音视频同步等
1.视频编码格式:H264, VC-1, MPEG-2, MPEG4-ASP (Divx/Xvid), VP8, MJPEG 等. 2.音频编码格式:AAC, AC3, DTS(-HD), True ...
- 音视频同步原理[ffmpeg]
音视频同步原理[ffmpeg] output_example.c 中AV同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题. 阅读前希望大家先了解一下时间戳的概念. /* compu ...
最新文章
- input 默认样式的修改
- maven eclipse 配置
- php用什么电脑,我要学php了买一台什么配置的电脑最好?
- NLP --- 隐马尔可夫HMM(第三个问题详解及HMM的应用)
- php 数组排序以及按照某个字段排序
- java机甲类回合制游戏,课内资源 - 基于java的RPG回合制游戏
- 脑与认知科学基础(期末复习)
- linux文件属性全解,Linux文件属性详细图解
- 逆函数求导公式_反函数求导公式
- spring batch的原则(避免停不下来)
- React Native桥接器初探
- C primer plus编程练习-第7章
- 【云原生学习3】Pod及K8S
- 【知识兔】Excel教程小案例之工作计划表(一)
- slot、slot-scope与v-slot替换
- PowerDesigner物理模型的创建
- 计算机换硬盘后 查启用时间,鲁大师怎么检测硬盘通电时间 硬盘使用时间查看方法介绍...
- MSP430F149——中断及案例
- Android Studio汉化(插件教程)
- c语言布尔变量定义,C语言布尔类型介绍 C语言标准(C89)没有定义布尔类型,如果你使用true...
热门文章
- 开店攻略: 购买行为越来越冲动性
- [转] 爱情的隐式马尔可夫模型(Love in the Hidden Markov Model)
- org.apache.jasper.JasperException: Unable to co...
- everyday words
- 2021牛客多校3 - 24dian(dfs)
- CodeForces - 1484E Skyline Photo(dp+单调栈)
- CodeForces - 123B Squares(简单几何+旋转坐标系)
- python写excel标记文字颜色_python3使用xlwt时写入文档字体颜色和边框样式
- EfficientDet解读
- php 的常量能不能删除,php能删除常量吗