IOS 基于ffmpeg的播放器kxmovie的音视频同步
2016-09-19 19:31
771 查看
本文介绍一个基于FFMPEG的开源播放器kxmovie音视频同步
项目下载地址为: 点击打开链接同步
同步有两类,一类是流内同步,其主要任务是保证单个媒体流内的时间关系,如按照规定的帧率播放一段视频;另一类是流间同步,主要任务是保证不同媒体流之间的时间关系,如音频和视频之间的播放时间关系。
DTS和PTS
DTS(Decoding Time Stamp)解码时间戳 ,
代码中视频帧DTS代码如下
constint64_t frameDuration =
av_frame_get_pkt_duration(_videoFrame);
if (frameDuration) {
frame.duration = frameDuration *_videoTimeBase;
frame.duration +=_videoFrame->repeat_pict *_videoTimeBase
* 0.5;
} else {
frame.duration =1.0 /
_fps;
}
代码中音频帧DTS代码如下
frame.duration =av_frame_get_pkt_duration(_audioFrame)
*_audioTimeBase;
PTS(Presentation Time Stamp)显示时间戳
代码中视频帧PTS代码如下
frame.position
= av_frame_get_best_effort_timestamp(_videoFrame)
* _videoTimeBase;
代码中音频帧PTS代码如下
frame.position =av_frame_get_best_effort_timestamp(_audioFrame)
*_audioTimeBase;
视频流内同步
const
NSTimeInterval correction = [selftickCorrection];
constNSTimeInterval time =
MAX(interval + correction,
0.01);
#ifdef DEBUG
//NSLog(@"time = %f,correction = %f",time,correction);
#endif
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, time
*NSEC_PER_SEC);
dispatch_after(popTime,dispatch_get_main_queue(), ^(void){
[selftick];
});
kxmovie通过定时器按照视频帧的DTS的时间来控制调用下一次解码,这里的NSTimeInterval correction是通过视频帧的PTS与系统时钟的实际时间比较来加减定时器的时间。
音视频流之间的同步
NSUInteger count =_audioFrames.count;
if (count >0) {
KxAudioFrame *frame =_audioFrames[0];
if (_decoder.validVideo) {
constCGFloat delta =
_moviePosition - frame.position;
if (delta < -0.1) {
memset(outData,0, numFrames * numChannels *sizeof(float));
break;// silence and exit
}
[_audioFramesremoveObjectAtIndex:0];
if (delta >0.1 && count >
1) {
continue;
}
}
kxmovie的同步方法是音频帧根据视频帧同步,播放音频帧时,判断音频帧的pts与当前的显示的视频帧的pts的大小,大于则表示音频数据先到了,不播放并保留在音频缓存数组里。
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- Managed Media Aggregation using Rtsp and Rtp
- [总结]FFMPEG视音频编解码零基础学习方法
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
- codeigniter教程之上传视频并使用ffmpeg转flv示例
- PHP使用ffmpeg给视频增加字幕显示的方法
- PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
- 快速解决Android平台移植ffmpeg的一些问题
- PHP使用FFmpeg获取视频播放总时长与码率等信息
- java调用ffmpeg实现视频转换的方法
- python+ffmpeg视频并发直播压力测试
- php使用ffmpeg向视频中添加文字字幕的实现方法
- [总结]FFMPEG视音频编解码零基础学习方法
- ffmpeg的headers设置
- ffmpeg从rtsp抓流存flv[c# NReco.VideoConverter flv]
- FFMPEG 从rtsp抓取流,转存为flv文件。C语言代码方式.
- CentOs 下安装 ffmpeg 以及添加 ogg 音频支持
- Nvidia硬解码总结
- Linux 下ffmpeg视频转码实战一安装
- php使用ffmpeg向视频中添加文字字幕的实现方法