无法为输出文件 #0 写入 header - moviepy

Could not write header for output file #0 - moviepy

我最近安装了 moviepy 并想用它来编辑视频。

我看到人们建议使用 moviepy ffmpeg_tools 以获得更好的性能。

所以我尝试了这个代码:

moviepy.ffmpeg_tools.ffmpeg_extract_audio('before.mp4', 'audio.wav')
moviepy.ffmpeg_tools.ffmpeg_merge_video_audio('after.mp4', 'audio.wav', 'new.mp4')

但是它给出了这个错误:

Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

我看到它成功地将音频保存到一个单独的文件中audio.wav,但问题是它没有将视频与音频合并。

我搜索并发现了一些类似的问题,例如 一个,但我不知道如何将其实现到我的代码中。

ffmpeg_merge_video_audio 的默认编解码器参数是 vcodec='copy'acodec='copy'

很多情况下复制编解码器是行不通的。

例如:
不支持带有 pcm_s16le 音频编解码器和 H.264 视频编解码器的 MP4 容器。

尝试指定音频编解码器和视频编解码器:

from moviepy.video.io import ffmpeg_tools

ffmpeg_tools.ffmpeg_extract_audio('before.mp4', 'audio.wav')
ffmpeg_tools.ffmpeg_merge_video_audio('after.mp4', 'audio.wav', 'new.mp4', vcodec='libx264', acodec='aac') 

我尝试使用合成模式重现错误。
我使用 FFmpeg 命令行工具来构建模式(用作输入):

ffmpeg -y -r 25 -f lavfi -i testsrc=size=192x108:rate=30 -f lavfi -i sine=frequency=400 -f lavfi -i sine=frequency=1000 -filter_complex amerge -vcodec libx264 -crf 17 -pix_fmt yuv420p -acodec aac -ar 22050 -t 30 before.mp4

ffmpeg -y -r 25 -f lavfi -i testsrc=size=192x108:rate=30 -vcodec libx264 -crf 17 -pix_fmt yuv420p -t 30 after.mp4

使用模式作为输入执行原始代码时出现错误:

Moviepy - Command returned an error
Traceback (most recent call last):
...
OSError: ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 9.2.1 (GCC) 20200122 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, wav, from 'audio.wav': Metadata: encoder : Lavf58.29.100 Duration: 00:00:30.00, bitrate: 1411 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'after.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.45.100 Duration: 00:00:30.00, start: 0.000000, bitrate: 42 kb/s Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 192x108 [SAR 1:1 DAR 16:9], 41 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler [mp4 @ 0000018d8b0a33c0] Could not find tag for codec pcm_s16le in stream #1, codec not currently supported in container Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument Stream mapping: Stream #1:0 -> #0:0 (copy) Stream #0:0 -> #0:1 (copy) Last message repeated 1 times


codec not currently supported in container和你的错误不一样,但是差不多...


不知道你用的是什么音视频码
如果您使用的是 AAC 和 H.264 编解码器,并且您想要复制编解码器(避免转码),您可以尝试以下代码示例:

from moviepy.video.io import ffmpeg_tools

ffmpeg_tools.ffmpeg_extract_audio('before.mp4', 'audio.mp4')  # Extract the audio to mp4 container
ffmpeg_tools.ffmpeg_merge_video_audio('after.mp4', 'audio.mp4', 'new.mp4')

将音频提取到 audio.mp4 复制 AAC 音频流(不将音频转码为 PCM 编解码器)。