前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SkeyeExPlayer(Windows)开发系列之解决分片录像时间戳不正常的问题

SkeyeExPlayer(Windows)开发系列之解决分片录像时间戳不正常的问题

原创
作者头像
Openskeye
发布2023-04-14 11:18:35
4700
发布2023-04-14 11:18:35
举报

本篇文章基于上一篇SkeyeExPlayer(Windows)开发系列之采用ffmpeg进行录像进行补充,测试发现录像的切片除了第一个时间戳是正常的,其他的初始时间戳均不正常而且是之前切片的时间长度的总和;更有甚者很长一段时间的录像都是黑屏无法播放的,为了解决这个问题,我们需要将时间戳进行修正。

经过分析,初始时间戳是ffmpeg读取网络流自带的时间戳,在过程中读取流进行录像,那么势必初始的时间戳需要进行减掉,执行过程如下:

  1. 首先,申请几个变量用以记录每次开始录像时的开始音视频时间戳,以及音视频是否进行重新录像标志:
代码语言:txt
复制
	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,并记录当前帧的时间戳为了下一个切片的开始时间戳:

代码语言:txt
复制
			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开始的;

代码语言:txt
复制
		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:

代码语言:txt
复制
		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;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档