项目要求实时播放视频,并且需要支持播放中途可以录制视频。但是录制出来的文件会黑屏,过一段时间后正常显示。即:码流采集--->播放--->(一段时间后)录制MP4,黑屏出现的时间就在采集到录制之前。
黑屏现象

原因:
将码流封装成文件主要是通过这个接口实现的
cpp
av_interleaved_write_frame(formatContext, &packet);
当开始录制时,传入的packet的pts(播放时间戳)不是从0开始,而视频的播放一般是从0开始播放,所以导致在没到pts时都是显示黑屏。
解决办法:对首帧时间戳进行了归零调整,相关代码如下
cpp
int media::saveVideo(AVFormatContext *iFormatContext, AVPacket &packet)
{
//写入的第一帧需要是关键帧,否则前面部分会花屏或者绿屏
if(!firstKeyFrame){
if(!(packet.flags & AV_PKT_FLAG_KEY)){
return -1;
}else{
firstKeyFrame = true;
}
}
qDebug() << "fwefvwae" << "调整前时间戳pts" << packet.pts;
//调整时间戳从0开始
if(isNewRecode){
adjust_dts = packet.dts;
adjust_pts = packet.pts;
isNewRecode = false;
}
packet.dts -= adjust_dts; //关键处理
packet.pts -= adjust_pts;
qDebug() << "fwefvwae" << "调整后时间戳pts" << packet.pts;
dts = packet.dts;
frame_count++;
//视频数据写文件
int ret;
ret = av_interleaved_write_frame(formatContext, &packet);
if(ret < 0){
printErrInfo("MediaRecord av_interleaved_write_frame ", ret);
}
return ret;
}
如果出现绿屏情况,是因为录制视频时传入的第一帧不是关键帧
