ffmpeg 3.2版本播放ts流正常,但是录制成为MP4的文件播放黑屏。终于把黑屏的问题解决了。
场景:用ffmpeg 3.2的库播放ts流或者m3u8文件正常,但是录制成为MP4文件的时候,只有声音,是黑屏的。
解决过程:Step1:采用ffmpeg 2.7进行ts流的录制,存为A.mp4,录像播放正常
Step2:通过Video Pro Analyzer 工具分析每一包数据,第一帧的数据大小是19396字节
Step3:采用采用ffmpeg 3.2进行ts流的录制,存为B.mp4,录像播放只有声音,没有画面。A和B保证 是从同一地方录制(有少许误差),保证第一帧是同一个画面。
Step4:通过Video Pro Analyzer 工具分析每一包数据,第一帧的数据大小是19410字节
Step5:再次重复上述动作,对原文件是MP4进行录制,发现数居一致。
Step6:进而初步判断利用ffmpeg3.2,执行
AVPacket stPkt;
int iFlag = 0;
int iRet = 0;
_RE_READ :
av_init_packet(&stPkt);
iRet = av_read_frame(thiz->pstCtx, &stPkt);
操作后,得到的AVPacket的size多了14个字节。
解决办法:在dumxer ts流的时候,判断如果是H264,对长度进行减14,
if (AV_CODEC_ID_H264 == thiz->pstCtx->streams[iIndex]->codec->codec_id &&
pstPkt !=NULL && pstPkt->data != NULL && pstPkt->size > 0)
{
pstPkt->size = pstPkt->size -14;
}
结果:录制出来的MP4文件播放正常。
(备注:1 之前采用的ffmpeg是2.7版本,现在换为3.2版本
2 2.7版本 设置
AVCodecContext的flags 如下:pstCodec->flags = CODEC_FLAG_GLOBAL_HEADER,
3.2版本改为 如下:pstCodec->flags = AV_CODEC_FLAG_GLOBAL_HEADER;
)