#bash #ffmpeg #python-3.x
#bash #ffmpeg #python-3.x
Вопрос:
Я пытаюсь написать скрипт на Python, который, помимо прочего, выполняет 2 прохода loudnorm
для видеофайлов.
Но я не могу получить информацию из 1-pass в свой скрипт python, он выводит только на экран.
Я пытался check_output
без успеха.
Код:
from subprocess import Popen, PIPE, DEVNULL, run, check_output
srcFile = 'test.webm'
command = ['ffmpeg', '-y', '-i', str(srcFile), '-vn', '-pass', '1', '-filter:a', 'loudnorm=print_format=json', '-f', 'webm', '/dev/null']
firstPass = check_output(command)
result = firstPass.decode('utf-8').split('n')
print(result)
Вывод:
['']
Хотя ffmpeg
выводит loudnorm
информацию за 1 проход на экран, я не могу загрузить ее в свой скрипт на python.
Что я делаю не так?
Комментарии:
1. Это может быть запись на
stderr
, а неstdout
. Попробуйте добавитьstderr=PIPE
в качестве аргумента вcheck_output()
.2. Что такое это «loudnorm 1-pass info»? Если это то, что обычно считается «диагностическим» по своей природе, stderr — это место, где спецификация POSIX указывает, что оно должно быть отправлено. (стандартный вывод предназначен для фактического вывода ; в случае ffmpeg его фактическим выводом являются данные в кодировке MPEG — хотя, конечно, большинство или все режимы использования отправляют эти данные непосредственно в файл).
3. @CharlesDuffy
firstPass = run(command, stderr=PIPE)
полностью сработал.loudnorm 1-pass info
: Я прошу ffmpeg запуститьloudnorm
фильтр для аудио и распечатать информацию, полученную из процесса, в оболочку. ffmpeg выберитеstderr
, чтобы распечатать его. Никогда бы не заговорил. Всегда думал оstderr
как о чем-то зловещем.4. А. Нет, ничего зловещего; stderr даже там, где bash печатает приглашение — все, что больше связано с предоставлением информационных данных людям, чем с отправкой содержимого, которое ваша программа начала генерировать, попадает туда.
Ответ №1:
Решение для Python 3.7:
import subprocess
srcFile = 'test.webm'
command = ['ffmpeg', '-y', '-i', str(srcFile), '-vn', '-pass', '1', '-filter:a', 'loudnorm=print_format=json', '-f', 'webm', '/dev/null']
commandout = subprocess.run(command, check=True, capture_output=True).stderr
result = commandout.decode('utf-8').split('n')
print(result)
Пример вывода с помощью ‘ffprobe’ (есть stderr):
['ffprobe version 4.4.1-full_build-www.gyan.dev Copyright (c) 2007-2021 the FFmpeg developersr', ' built with gcc 11.2.0 (Rev1, Built by MSYS2 project)r', ' configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprintr', ' libavutil 56. 70.100 / 56. 70.100r', ' libavcodec 58.134.100 / 58.134.100r', ' libavformat 58. 76.100 / 58. 76.100r', ' libavdevice 58. 13.100 / 58. 13.100r', ' libavfilter 7.110.100 / 7.110.100r', ' libswscale 5. 9.100 / 5. 9.100r', ' libswresample 3. 9.100 / 3. 9.100r', ' libpostproc 55. 9.100 / 55. 9.100r', "Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Voz 024_sd.m4a':r", ' Metadata:r', ' major_brand : 3gp4r', ' minor_version : 0r', ' compatible_brands: isom3gp4r', ' creation_time : 2022-09-06T22:48:56.000000Zr', ' com.android.version: 12r', ' Duration: 01:10:25.25, start: 0.000000, bitrate: 130 kb/sr', ' Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 128 kb/s (default)r', ' Metadata:r', ' creation_time : 2022-09-06T22:48:56.000000Zr', ' handler_name : SoundHandler', ' vendor_id : [0][0][0][0]r', '']
Я делюсь этим, потому что это головная боль, может быть, это поможет какому-нибудь счастливчику.