Как получить вывод из ffmpeg в python?

#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', '']
  

Я делюсь этим, потому что это головная боль, может быть, это поможет какому-нибудь счастливчику.