FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

Posted Jack_Chai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法相关的知识,希望对你有一定的参考价值。

本文出处:http://blog.csdn.net/chaijunkun/article/details/117535933,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

拼接视频文件时的一个报错

书接上回,在上一篇文章:FFmpeg实现音视频同步的精准片段拼接中我在最后提到了使用concat方式拼接多段视频文件的方法。主要还是由于目前的自动化任务中,视频数量不可控。直接使用concat滤镜来进行拼接,内存会被撑爆,因此使用了ffmpeg -f concat -i manifest.txt这样的方式来进行拼接。

但是在拼接过程中,出现了以下的一段报错:

...正常编码信息...
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000017079753400] Auto-inserting h264_mp4toannexb bitstream filter0 speed=1.45x
[aac @ 0000017075f0acc0] channel element 1.0 is not allocated
Error while decoding stream #0:1: Invalid data found when processing input
[aac @ 0000017075f0acc0] channel element 1.4 is not allocated
Error while decoding stream #0:1: Invalid data found when processing input
[h264 @ 0000017075f22700] No start code is found.
[h264 @ 0000017075f22700] Error splitting the input into NAL units.
...以下重复上述错误信息...

主要是“channel element 1.0 is not allocated”,当然中间的数字是可变的,既然报错了,那么就打开FFmpeg的源码,来看看在哪里报这段错误,最终,我在libavcodec/aacdec_template.c中找到了这段错误的细节:

const int elem_type = aac_channel_layout_map[chan_config-1][i][0];
const int elem_id   = aac_channel_layout_map[chan_config-1][i][1];
if (!(che=get_che(ac, elem_type, elem_id))) 
	av_log(ac->avctx, AV_LOG_ERROR,
	"channel element %d.%d is not allocated\\n",
	elem_type, elem_id);
	return AVERROR_INVALIDDATA;

本错误在处理aac编码的音频流时发生,由于concat过程中,所有流的布局都是以第一个文件为准,那么后续所有文件的流布局必须也和第一个文件相同。例如有如下清单文件:

# manifest.txt
file 'video_01.mp4'
file 'video_02.mp4'

通过ffprobe命令查看流的布局信息:

ffprobe -show_streams -of json video_01.mp4

发现流的布局为:

"index": 0,
"codec_name": "h264",
"codec_type": "video",
...
"index": 1,
"codec_name": "aac",
"codec_type": "audio",

可以看到,流的布局:
0:视频流;
1:音频流。
再查看第二个文件的流布局:

"index": 0,
"codec_name": "aac",
"codec_type": "audio",
...
"index": 1,
"codec_name": "h264",
"codec_type": "video",

可以看到,流的布局:
0:音频流;
1:视频流。
···
流的顺序不一致,导致拼接失败。因此,只要统一顺序就可以了。一般习惯视频文件的第一个流为视频流,第二个流为音频流。

ffmpeg -i video_02.mp4 -c copy -map "0:v" -map "0:a" video_remapping_02.mp4

然后拼接时使用:

# manifest.txt
file 'video_01.mp4'
file 'video_remapping_02.mp4'

命令:

ffmpeg -f concat -i manifest.txt -c copy concat.mp4

以上是关于FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

Jenkins集成时报错 hudson.remoting.Channel$CallSiteStackTrace: Remote call to JNLP4-connect connection fro

mybatis批量插入insert时报错

pytorch中使用多显卡训练以及训练时报错:expect more than 1 value per channel when training, got input size..

mac端ffmpeg批量合成ts生成MP4