項目要求實時播放視頻,并且需要支持播放中途可以錄制視頻。但是錄制出來的文件會黑屏,過一段時間后正常顯示。即:碼流采集—>播放—>(一段時間后)錄制MP4,黑屏出現的時間就在采集到錄制之前。
黑屏現象
原因:
將碼流封裝成文件主要是通過這個接口實現的
av_interleaved_write_frame(formatContext, &packet);
當開始錄制時,傳入的packet的pts(播放時間戳)不是從0開始,而視頻的播放一般是從0開始播放,所以導致在沒到pts時都是顯示黑屏。
解決辦法:對首幀時間戳進行了歸零調整,相關代碼如下
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;
}
如果出現綠屏情況,是因為錄制視頻時傳入的第一幀不是關鍵幀