我的代码出现这个错误是因为我在打开解码器的时候是自己构造的: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软解码遇到的坑

更多推荐