【问题标题】:What does it mean "invalid NAL unit size" for h.264 decoder?h.264 解码器的“无效 NAL 单元大小”是什么意思?
【发布时间】:2019-12-22 22:48:18
【问题描述】:

我想使用 Libav 将 .mkv 文件转换为 .mp4,但是当我尝试解码视频 h.264 流时,我的代码出现故障

NAL 单元大小无效 21274662>141

将输入拆分为 NAL 单元时出错

流似乎包含带有附件 B 格式数据的 AVCC 额外数据,该数据无效。 没有框架!

无法发送解码包(“处理输入时错误无效数据”)

下面提供了相关的代码部分。

while(!(ret = av_read_frame(ifmt_ctx, &input_packet))&&(ret>=0)){

         if ((ret = avcodec_send_packet(avctx, &input_packet)) < 0) {
            fprintf(stderr, "Could not send packet for decoding (error '%s')\n",get_error_text(ret));
            return ret;
        }

        ret = avcodec_receive_frame(avctx, iframe);
        if (ret == AVERROR(EAGAIN)) {
            goto read_another_frame;
            /* If the end of the input file is reached, stop decoding. */
        } else if (ret == AVERROR_EOF) {
            break;
        } else if (ret < 0) {
            fprintf(stderr, "Could not decode frame (error '%s')\n",get_error_text(ret));
            break;
        }
        // Default case: encode data
         else {

        }

我主要使用新的 API(发送/接收数据包/帧)并且存在混淆,因为似乎 h.264 需要一个特殊的实现。我期待着从哪里开始调试的任何想法。

【问题讨论】:

    标签: api decode h.264 libav mux


    【解决方案1】:

    【讨论】:

    • 是否有可能只使用 Libav h.264 解码器来解码数据?
    • 相对于什么?如果您只想用访问单元填充 AVPacket 并调用解码,那么可以。如果您想绕过该抽象,仍然可以,但要困难得多。无论哪种方式,您都必须先从容器中打开 ES。
    • 谢谢!对于 ES 数据,您的意思是 avctx->extradata_size(在我的情况下为 35)和 avctx->extradata(在我的情况下为 0x16125e0 "\001M@\037\377")吗?抱歉这个愚蠢的问题......我找不到合适的文档
    • 不,我的意思是原始基本流(去容器化)
    【解决方案2】:

    我认为这是因为您没有检查数据包是否来自视频流。换句话说,您的代码将来自所有流的所有数据包发送到 h.264 编解码器。

    在这种情况下,解决该问题的一种方法是添加一个简单的条件来跳过非视频流数据包:

    if (input_packet->stream_index != video_stream->index) continue;
    

    假设 video_stream 是格式上下文流数组 ifmt_ctx->streams 中遇到的第一个视频流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2011-11-26
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多