Получить статистику по команде конвертации FLAC в MP3 (LAME)

Вопрос или проблема

Я пишу простой скрипт на Ruby для пакетного преобразования FLAC в MP3, отправляя декодированный FLAC в stdout (чтобы избежать временных файлов):

flac.exe -d -c in.flac | lame.exe - out.mp3

В Ruby я легко могу запустить команду с помощью функции “system” или метода pipeline:

cmd1 = 'flac.exe -d -c in.flac'
cmd2 = 'lame.exe - out.mp3'
process = Open3.pipeline(cmd1, cmd2)

Проблема в том, что, несмотря на то, что все конвертируется идеально, во время конвертации LAME ничего не показывает на экране. Отображается только вывод декодера FLAC, но гистограмма LAME вместе со всеми ее статистиками не показывается.

flac 1.4.3
Copyright (C) 2000-2009 Josh Coalson, 2011-2023 Xiph.Org Foundation
flac поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Это бесплатное программное обеспечение, и вы
можете распространять его на определенных условиях. Введите `flac` для деталей

in.flac: 65% завершено

Если я установлю опцию –silent для FLAC, это просто подавляет вывод, но LAME по-прежнему ничего не выводит. Я читал, что если установить вывод LAME на ‘-‘, это отправит все в stdout:

flac.exe -d -c in.flac | lame.exe - - > out.mp3

Но я все равно не могу получить отображение статистики LAME.
Есть ли помощь? желательно кросс-платформенная (хотя я в основном использую Windows). С уважением.

Ответ или решение

Конвертация файлов из формата FLAC в MP3 с использованием утилиты LAME требует внимания к детальным настройкам, особенно если вы стремитесь получить статистику процесса конвертации в командной строке. Разберем, как этого можно достичь, учитывая вашу цель — выполнение этой задачи в Ruby, а также кросс-платформенность вашего решения.

Проблема

Вы хотите конвертировать FLAC-файлы в MP3 с помощью Ruby-скрипта, избегая создания временных файлов, и одновременно получить статистику от LAME во время преобразования. Однако, несмотря на то, что сам процесс преобразования проходит успешно, LAME не выводит на экран никакой информации.

Причина

Отсутствие вывода статистики LAME связано с направлением потоков ввода-вывода. Когда вы используете команду lame.exe - -, вывод LAME, который обычно идет в stderr (стандартный поток ошибок), не отображается, что делает невозможным его просмотр в обычном режиме.

Решение

Чтобы отслеживать статистику конвертации, необходимо правильно перенаправить потоки в Ruby. Давайте рассмотрим, как это можно сделать:

  1. Использование Open3: Модуль Ruby Open3 позволяет контролировать потоки ввода, вывода и ошибок, предоставляя больше гибкости по сравнению с использованием только system.

  2. Перенаправление stderr LAME: Убедитесь, что стандартный поток ошибок перенаправлен на стандартный вывод, чтобы вы могли видеть данные по конверсии. Это можно сделать следующим образом:

require 'open3'

cmd1 = 'flac.exe -d -c in.flac'
cmd2 = 'lame.exe - - out.mp3 2>&1'

# Использование Open3 для управления потоками данных
Open3.popen3("#{cmd1} | #{cmd2}") do |stdin, stdout, stderr, wait_thr|
  Thread.new do
    stdout.each { |line| puts "STDOUT: #{line}" }
  end

  # Захватываем и выводим информацию из stderr
  Thread.new do
    stderr.each { |line| puts "STDERR: #{line}" }
  end

  # Ожидаем окончания процесса
  exit_status = wait_thr.value
  unless exit_status.success?
    abort "Проблема с конверсией: процесс завершился со статусом #{exit_status.exitstatus}"
  end
end

Пояснение

  • Open3.popen3 покрывает работу со всеми тремя потоками: stdin, stdout, и stderr. Это позволяет вам специально выделять статистику, идущую от LAME, на stderr.

  • Перенаправление 2>&1 в cmd2 объединяет stderr и stdout, что позволяет их обрабатывать вместе.

Эти шаги позволят вам увидеть статистические данные и информацию о процессе, которая идет от LAME, что будет полезно для мониторинга конверсии.

Заключение

Применив данные рекомендации, вы сможете контролировать конвертацию файлов из FLAC в MP3, получая полную статистику процесса непосредственно в командной строке, что важно для оценки производительности и успешности выполнения. Учитывая кросс-платформенный характер данного метода, он должен работать как на Windows, так и на других системах, поддерживаемых Ruby.

Оцените материал
Добавить комментарий

Капча загружается...