EasyPlayerPro(Windows)开发系列之解决分片录像时间戳不正常的问题
2017-10-04 21:08
471 查看
本篇文章基于上一篇EasyPlayerPro(Windows)开发系列之采用ffmpeg进行录像进行补充,测试发现录像的切片除了第一个时间戳是正常的,其他的初始时间戳均不正常而且是之前切片的时间长度的总和;更有甚者很长一段时间的录像都是黑屏无法播放的,为了解决这个问题,我们需要将时间戳进行修正。
经过分析,初始时间戳是ffmpeg读取网络流自带的时间戳,在过程中读取流进行录像,那么势必初始的时间戳需要进行减掉,执行过程如下:
1. 首先,申请几个变量用以记录每次开始录像时的开始音视频时间戳,以及音视频是否进行重新录像标志:
2.当达到切片条件时,置重新开启标志为1,并记录当前帧的时间戳为了下一个切片的开始时间戳:
这里做了个简单的处理,也就是当以视频为时间戳检测标准时,需要要在关键帧到来时进行判断,从而保证下一个切片的开始是以关键帧开始的。
3.当重新录像标志为真的时候,则重置开始时间戳,从而在下一次切片时保证时间戳是从0开始的;
为了保证录像的成功,需要把小于0的时间戳置为0:
经过分析,初始时间戳是ffmpeg读取网络流自带的时间戳,在过程中读取流进行录像,那么势必初始的时间戳需要进行减掉,执行过程如下:
1. 首先,申请几个变量用以记录每次开始录像时的开始音视频时间戳,以及音视频是否进行重新录像标志:
int64_t audio_start_pts = -1; int64_t audio_start_dts = -1; int64_t video_start_pts = -1; int64_t video_start_dts = -1; bool audio_re_record = false; bool video_re_record = false;
2.当达到切片条件时,置重新开启标志为1,并记录当前帧的时间戳为了下一个切片的开始时间戳:
if (play->record_duration > 0 && fRecTime > play->record_duration && i_pkt.flags == AV_PKT_FLAG_KEY) { audio_re_record = true; video_re_record = true; }
这里做了个简单的处理,也就是当以视频为时间戳检测标准时,需要要在关键帧到来时进行判断,从而保证下一个切片的开始是以关键帧开始的。
3.当重新录像标志为真的时候,则重置开始时间戳,从而在下一次切片时保证时间戳是从0开始的;
if (in_stream->codec->codec_type == AVMEDIA_TYPE_VIDEO)//不支持的视频 过滤 { if (video_start_pts < 0) video_start_pts = i_pkt.pts; if (video_start_dts < 0) video_start_dts = i_pkt.dts; if (video_re_record) { video_start_pts = i_pkt.pts; video_start_dts = i_pkt.dts; video_re_record = false; } i_pkt.pts = i_pkt.pts - video_start_pts; i_pkt.dts = i_pkt.dts - video_start_dts; } if (in_stream->codec->codec_type == AVMEDIA_TYPE_AUDIO )//不支持的音频 过滤 { if (audio_start_pts < 0) audio_start_pts = i_pkt.pts; if (audio_start_dts < 0) audio_start_dts = i_pkt.dts; if (audio_re_record) { audio_start_pts = i_pkt.pts; audio_start_dts = i_pkt.dts; audio_re_record = false; } i_pkt.pts = i_pkt.pts - audio_start_pts; i_pkt.dts = i_pkt.dts - audio_start_dts; }
为了保证录像的成功,需要把小于0的时间戳置为0:
i_pkt.pts = (i_pkt.pts > 0) ? i_pkt.pts : 0; i_pkt.dts = (i_pkt.dts > 0) ? i_pkt.dts : 0; i_pkt.duration = (i_pkt.duration > 0) ? i_pkt.duration : 0;
相关文章推荐
- EasyPlayerPro(Windows)开发系列之解决ffmpeg接口调用卡住的问题
- 使用Automachron软件解决Windows时间同步功能不能正常使用问题
- EasyPlayerPro(Windows)开发系列之采用ffmpeg进行截图
- EasyPlayerPro(Windows)开发系列之采用ffmpeg进行录像
- WPF开发中遇到的问题及解决系列(三):如何改变ListView 中各行的背景色(背景色产生交替效果)
- WCF开发中遇到的问题及解决系列(一):运行WCF客户端时碰到错误“AddressAlreadyInUseException”
- Excel开发系列二 解决.net生成Excel文件速度问题的若干方案
- 在Windows 2000 英文版操作系统中不能正常安装软件和显示中文问题的解决.
- windows平台下的netbeans开发C++,以及常见问题的解决
- 解决 Windows 和 Ubuntu 时间不一致的问题--转载
- 解决windows 7 部分程序图标显示不正常的问题
- 解决windows下APACHE服务无法正常启动问题
- Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决-转载
- 网站开发系列之小问题解决
- 解决JAVA获取Windows系统时间问题
- 从服务器上导入解决方案后二次开发包不能正常加载的问题解决。
- Windows没有北京时间(GMT+8时区)的问题,及QQ聊天栏中显示的时间错误的问题解决办法
- 转帖:解决 Windows、Mac 和 Ubuntu 时间不一致的问题
- WPF开发中遇到的问题及解决系列(二):如何获取通过binding生成的ComboBox或者ListBox等的Item
- 系统时间同步设置!解决Windows时间同步失败问题!