本文主要介绍 android 多媒体中,音视频同步问题。
以下是详细说明:
先提及一个背景基础知识:
Stagefright中,audio的数据输出是通过AudioTrack中的callback来不断驱动AudioPlayer::fillBuffer获取数据
video的数据输出,则是由OMX端在解码完毕后,给awesomeplayer发送消息event,在awesomeplayer的onVideoEvent中进行视频的render。
在render之前进行AV同步工作
具体细节不再赘述。读者可自行参考其他文章。
所以本文实际上重点研究的就是AV同步的处理函数:onVideoEvent
一,既然牵扯到AV同步,肯定涉及到一个时间基准的问题。
AV同步目前有两种同步方法:
1,视频,音频同步到一个第三方系统时钟
2,以音频时间戳为基准,视频数据同步到音频时间戳上
两种方法各有优缺点,
第一种方法中,音频视频不能互相感知,如果有一方出现了问题,一样会造成AV时间不同步。尤其是如果AV中一方有一个长时间的累积误差,这种方法就无能为力了。因为他们不能互相修正。
第二种方法中,必须有音频做基准,对于一些没有音频,只有视频的媒体文件,这种方法就无能为力了。
所以android目前对这两种都采用了:
对于音频,视频都健全的文件,把视频同步到音频上。对于没有音频,只有视频的文件,把视频同步到第三方时钟上,即系统时钟
以下是详细说明:
先提及一个背景基础知识:
Stagefright中,audio的数据输出是通过AudioTrack中的callback来不断驱动AudioPlayer::fillBuffer获取数据
video的数据输出,则是由OMX端在解码完毕后,给awesomeplayer发送消息event,在awesomeplayer的onVideoEvent中进行视频的render。
在render之前进行AV同步工作
具体细节不再赘述。读者可自行参考其他文章。
所以本文实际上重点研究的就是AV同步的处理函数:onVideoEvent
一,既然牵扯到AV同步,肯定涉及到一个时间基准的问题。
AV同步目前有两种同步方法:
1,视频,音频同步到一个第三方系统时钟
2,以音频时间戳为基准,视频数据同步到音频时间戳上
两种方法各有优缺点,
第一种方法中,音频视频不能互相感知,如果有一方出现了问题,一样会造成AV时间不同步。尤其是如果AV中一方有一个长时间的累积误差,这种方法就无能为力了。因为他们不能互相修正。
第二种方法中,必须有音频做基准,对于一些没有音频,只有视频的媒体文件,这种方法就无能为力了。
所以android目前对这两种都采用了:
对于音频,视频都健全的文件,把视频同步到音频上。对于没有音频,只有视频的文件,把视频同步到第三方时钟上,即系统时钟