FFmpeg命令终端正常运行但Python subprocess执行报错
问题描述
制作MKV视频时,使用Python 3.11.2的subprocess模块执行FFmpeg命令失败,但相同命令在同一终端会话、同一FFmpeg版本下可正常运行。
终端中可成功执行的FFmpeg命令:
ffmpeg -y \ -i input_video_stream.mkv \ -i input_audio_stream_1.ac3 \ -i input_audio_stream_2.ac3 \ -i input_audio_stream_3.ac3 \ -i input_audio_stream_4.ac3 \ -f srt -i input_subtitle_stream_1.srt \ -f srt -i input_subtitle_stream_2.srt \ -map 0 -map 1 -map 2 -map 3 -map 4 -map 5 -map 6 \ -c copy \ -metadata:s:a:0 language=eng -metadata:s:a:0 title="English1" \ -metadata:s:a:1 language=eng -metadata:s:a:1 title="English2" \ -metadata:s:a:2 language=eng -metadata:s:a:2 title="English3" \ -metadata:s:a:3 language=eng -metadata:s:a:3 title="English4" \ -metadata:s:s:0 language=eng -metadata:s:s:0 title="English1" -metadata:s:s:0 mimetype=application/x-ass \ -metadata:s:s:1 language=eng -metadata:s:s:1 title="English2" -metadata:s:s:1 mimetype=application/x-ass \ -disposition:a:0 default -disposition:s:s:0 default \ output_video_with_audio_and_subtitles.mkv
Python的subprocess执行代码:
subprocess.run([ 'ffmpeg', '-y', '-i', 'input_video_stream.mkv', '-i', 'input_audio_stream_1.ac3', '-i', 'input_audio_stream_2.ac3', '-i', 'input_audio_stream_3.ac3', '-i', 'input_audio_stream_4.ac3', '-f', 'srt', '-i', 'input_subtitle_stream_1.srt', '-f', 'srt', '-i', 'input_subtitle_stream_2.srt', '-map', '0', '-map', '1', '-map', '2', '-map', '3', '-map', '4', '-map', '5', '-map', '6', '-c', 'copy', '-metadata:s:a:0', 'language=eng', '-metadata:s:a:0', 'title="English1"', '-metadata:s:a:1', 'language=eng', '-metadata:s:a:1', 'title="English2"', '-metadata:s:a:2', 'language=eng', '-metadata:s:a:2', 'title="English3"', '-metadata:s:a:3', 'language=eng', '-metadata:s:a:3', 'title="English4"', '-metadata:s:s:0', 'language=eng', '-metadata:s:s:0', 'title="English1"', '-metadata:s:s:0', 'mimetype=application/x-ass', '-metadata:s:s:1', 'language=eng', '-metadata:s:s:1', 'title="English2"', '-metadata:s:s:1', 'mimetype=application/x-ass', '-disposition:a:0 default', '-disposition:s:s:0 default', 'output_video_with_audio_and_subtitles.mkv' ])
执行后报错信息:
ffmpeg version 5.1.2-3 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12 (Debian 12.2.0-14) configuration: --prefix=/usr --extra-version=3 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared libavutil 57. 28.100 / 57. 28.100 libavcodec 59. 37.100 / 59. 37.100 libavformat 59. 27.100 / 59. 27.100 libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100 Input #0, matroska,webm, from 'input_video_stream.mkv': Metadata: ENCODER : Lavf59.27.100 Duration: 00:44:19.94, start: 0.000000, bitrate: 22551 kb/s Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn (default) Metadata: BPS : 22549589 NUMBER_OF_FRAMES: 63631 NUMBER_OF_BYTES : 7480665638 _STATISTICS_WRITING_APP: mkvmerge v56.0.0 ('Strasbourg / St. Denis') 64-bit _STATISTICS_WRITING_DATE_UTC: 2023-05-15 08:21:43 _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES DURATION : 00:44:19.942000000 [ac3 @ 0x55b374ee9e80] Estimating duration from bitrate, this may be inaccurate Input #1, ac3, from 'input_audio_stream_1.ac3': Duration: 00:44:19.89, start: 0.000000, bitrate: 448 kb/s Stream #1:0: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s [ac3 @ 0x55b37502ef80] Estimating duration from bitrate, this may be inaccurate Input #2, ac3, from 'input_audio_stream_2.ac3': Duration: 00:44:19.89, start: 0.000000, bitrate: 192 kb/s Stream #2:0: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s [ac3 @ 0x55b374efc900] Estimating duration from bitrate, this may be inaccurate Input #3, ac3, from 'input_audio_stream_3.ac3': Duration: 00:43:19.18, start: 0.000000, bitrate: 384 kb/s Stream #3:0: Audio: ac3, 48000 Hz, stereo, fltp, 384 kb/s [ac3 @ 0x55b374fd60c0] Estimating duration from bitrate, this may be inaccurate Input #4, ac3, from 'input_audio_stream_4.ac3': Duration: 00:43:19.18, start: 0.000000, bitrate: 192 kb/s Stream #4:0: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s Input #5, srt, from 'input_subtitle_stream_1.srt': Duration: N/A, bitrate: N/A Stream #5:0: Subtitle: subrip Input #6, srt, from 'input_subtitle_stream_2.srt': Duration: N/A, bitrate: N/A Stream #6:0: Subtitle: subrip [matroska @ 0x55b3751a1940] Invalid stream specifier: a:0 default. Last message repeated 1 times
报错核心信息:Invalid stream specifier: a:0 default
解决方法
问题出在subprocess的参数列表中,-disposition:a:0 default和-disposition:s:s:0 default被当成了单个参数传递,但FFmpeg要求-disposition是选项,后面跟的a:0 default是该选项的参数,必须拆分成两个独立的列表元素。
终端执行时shell会自动以空格分隔参数,但subprocess的列表模式不会自动拆分,需要手动拆分每个选项与对应参数。
修正后的Python代码:
subprocess.run([ 'ffmpeg', '-y', '-i', 'input_video_stream.mkv', '-i', 'input_audio_stream_1.ac3', '-i', 'input_audio_stream_2.ac3', '-i', 'input_audio_stream_3.ac3', '-i', 'input_audio_stream_4.ac3', '-f', 'srt', '-i', 'input_subtitle_stream_1.srt', '-f', 'srt', '-i', 'input_subtitle_stream_2.srt', '-map', '0', '-map', '1', '-map', '2', '-map', '3', '-map', '4', '-map', '5', '-map', '6', '-c', 'copy', '-metadata:s:a:0', 'language=eng', '-metadata:s:a:0', 'title="English1"', '-metadata:s:a:1', 'language=eng', '-metadata:s:a:1', 'title="English2"', '-metadata:s:a:2', 'language=eng', '-metadata:s:a:2', 'title="English3"', '-metadata:s:a:3', 'language=eng', '-metadata:s:a:3', 'title="English4"', '-metadata:s:s:0', 'language=eng', '-metadata:s:s:0', 'title="English1"', '-metadata:s:s:0', 'mimetype=application/x-ass', '-metadata:s:s:1', 'language=eng', '-metadata:s:s:1', 'title="English2"', '-metadata:s:s:1', 'mimetype=application/x-ass', '-disposition:a:0', 'default', '-disposition:s:s:0', 'default', 'output_video_with_audio_and_subtitles.mkv' ])
内容的提问来源于stack exchange,提问作者8TM
相关产品推荐
相关产品推荐

