无法为输出文件 #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 中,但问题是它没有将视频与音频合并。

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

解决方法

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 - 命令返回错误
回溯(最近一次调用最后一次):
...
OSError:ffmpeg 版本 4.2.2 版权所有 (c) 2000-2019 FFmpeg 开发人员 使用 gcc 9.2.1 (GCC) 20200122 构建 配置:--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 libav格式 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 输入流 #0.0 的猜测通道布局:立体声 输入#0,wav,来自'audio.wav': 元数据: 编码器:Lavf58.29.100 时长:00:00:30.00,比特率:1411 kb/s 流 #0:0:音频:pcm_s16le ([1][0][0][0] / 0x0001),44100 Hz,立体声,s16,1411 kb/s 输入 #1,mov,mp4,m4a,3gp,3g2,mj2,from 'after.mp4': 元数据: 主要品牌:isom 次要版本:512 兼容品牌:isomiso2avc1mp41 编码器:Lavf58.45.100 持续时间:00:00:30.00,开始:0.000000,比特率:42 kb/s 流 #1:0(und): 视频: h264 (High) (avc1 / 0x31637661),yuv420p,192x108 [SAR 1:1 DAR 16:9],41 kb/s,25 fps,25 tbr,12,850 t待定(默认) 元数据: handler_name : VideoHandler [mp4 @ 0000018d8b0a33c0] 在流 #1 中找不到编解码器 pcm_s16le 的标签,容器当前不支持编解码器 无法为输出文件 #0 写入标头(编解码器参数不正确?):参数无效 流映射: 流 #1:0 -> #0:0(复制) 流 #0:0 -> #0:1(复制) 最后一条消息重复了 1 次


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 编解码器)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...