我想使用Libav将.mkv文件转换为.mp4,但是当我尝试解码h.264视频流时,我的代码有故障
无效的NAL单位大小21274662> 141
将输入拆分为NAL单元时出错
该流似乎包含AVCC额外数据以及无效的附件B格式的数据。 没有框架!
无法发送用于解码的小包(“处理输入时出错,数据无效”)
下面提供了相关的代码部分。
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似乎需要特殊的实现。我期待从哪里开始调试的任何想法。
答案 0 :(得分:0)
答案 1 :(得分:-1)
我认为这是因为您没有检查数据包是否来自视频流。换句话说,您的代码将所有流中的所有数据包发送到h.264编解码器。
在这种情况下,解决该问题的一种方法是添加一个简单的条件,从而跳过非视频流数据包,例如:
if (input_packet->stream_index != video_stream->index) continue;
假定 video_stream 是格式上下文流数组 ifmt_ctx-> streams 中被加密的第一个视频流。