FFMPEG 解码出现[h264 @ 0x] No start code is found.错误或者返回-11(AVERROR(EAGAIN) )
·
我的代码出现这个错误是因为我在打开解码器的时候是自己构造的:AVCodecParameters *param;
....略
m_decodec = avcodec_find_decoder(codeIdTrans(AV_CODEC_ID_H264));
auto tmpCodecParamPtr = std::make_shared<AVCodecParameters>();
tmpCodecParamPtr->width = decodecParamPtr->width;
tmpCodecParamPtr->height = decodecParamPtr->height;
tmpCodecParamPtr->codec_type = AVMEDIA_TYPE_VIDEO;
int ret = avcodec_parameters_to_context(m_decodecCtx, tmpCodecParamPtr);
...略
我原来的本意是不依赖于输入流的AVCodecParameters,直接从输入流的已知信息中获取到的关键参数中自己构造一个AVCodecParameters,如此构造后也能正常解码,但是解码的输入流有非常严格的限制:
输入的pkt中data数据必须是以00 00 00 01开头的数据,比如ps流 rtsp rtp 数据就能正常解码,但是如果打开的流是flv MP4等就会出现错误:No start code is found,或者一直返回AVERROR(EAGAIN)
解决方案:
1、FFmpeg解码错误: No start code is found,Error splitting the input into NAL units.解决办法
说白了就是还是要将输入流的AVCodecParameters拷贝过来。
2、增加bsf(我这边又出现新问题)
fmpeg中新的BitStreamFilter
我觉得整体思路是:
如果你采用ffmpeg的av_read_frame去解封装,那么后处理,比如通过bsf过滤器获取startcode的数据,或者ffmCodec去解码,那么你就要用输入流中的codecparams,如果你自己代码去解封装,那么输入到它的解码器的数据必须是带startcodec的数据。
参考:
1、ffmpeg软解码遇到的坑
更多推荐


所有评论(0)