Использование декодера FLAC и кодировщика LAME для преобразования файлов FLAC с использованием Python

В настоящее время я пытаюсь выполнить проект по автоматизации каталогизации моей музыкальной библиотеки с помощью сценариев Python, и мне отчаянно нужна помощь, прежде чем я сойду с ума. Для начала я использую Linux (точнее, Arch Linux). Чтобы объяснить, я недавно начал использовать Morituri для копирования моей коллекции компакт-дисков. Мне особенно нравится скрипт Mortituri, потому что он трижды проверяет файлы и сразу же создает файлы FLAC.

Эта вышеуказанная система работает нормально, но я столкнулся с другой проблемой. Мне нравятся файлы FLAC для моего ПК, но для мобильного использования мне нужны файлы MP3. Я наткнулся на этот знаменитый маленький скрипт bash:

for f in *.flac; do flac -cd "$f" | lame -b 320 - "${f%.*}".mp3; done

Я увидел этот замечательный маленький скрипт и понял, что должен быть какой-то способ воспроизвести его на питоне. Поэтому я начал работать над сценарием, который конвертирует FLAC в MP3 и использует основные аргументы, используемые их соответствующими интерфейсами CLI. Я решил, что лучше всего начинать с одного файла за раз и продвигаться вверх. Немного изучив модуль подпроцесса и каналы в python, я написал следующий код:

#!/usr/bin/python3

from subprocess import *

MyTestFile = ('/path/to/file.flac')

def Convert_It(File):
with open(File, 'r') as infile:
    FlacDecode = Popen(["flac", "-cd","-","-"],stdin=infile,stdout=PIPE)
    LameEncode = Popen(["lame", "-b", "192","-", "/a/differnet/path/test.mp3"],stdin=PIPE)

Convert_It(MyTestFile)

Как оказалось, вывод этого скрипта выглядит следующим образом:

flac 1.3.1, Copyright (C) 2000-2009  Josh Coalson, 2011-2014  Xiph.Org Foundation
flac comes with ABSOLUTELY NO WARRANTY.  This is free software, and you are
welcome to redistribute it under certain conditions.  Type `flac' for details.



-: ERROR while decoding metadata
state = FLAC__STREAM_DECODER_END_OF_STREAM
Warning: unsupported audio format

Итак, у меня есть несколько вопросов:

  1. Почему FLAC ведет себя таким образом? При тестировании скрипта я указал путь к реальному файлу FLAC. Почему оно говорит это?

  2. Как я могу заставить это работать?!

Действительно, любой способ с помощью простых команд. Такие программы, как ffmpeg, не очень просты для понимания (как установить значение LAME q равным 0? Понятия не имею.) И другие скрипты python слишком длинные (например, flac2all), чтобы я мог их реконструировать.

В обзоре принимается любая помощь. При условии, что это соответствует моим спецификациям: 1. Использование только голых инструментов FLAC и LAME для Linux (без sox или ffmpeg), 2. Не слишком длинный скрипт. 3. Не создает временный файл WAV. 4. Может кодировать любой файл Flac в MP3. Я даже не беспокоюсь о метаданных. Только сам файл.

Пожалуйста помоги!

РЕДАКТИРОВАТЬ 05.08.2015:

Я обнаружил, что неправильно использую трубы. Вот код, который я создал, который решает мою проблему:

FlacDecode = subprocess.Popen(["flac","-cds",MyFile,"-"],stdout=subprocess.PIPE)
LameEncode = subprocess.Popen(['lame','-b','320','-'(NewFilePath)],stdin=FlacDecode.stdout,stdout=subprocess.PIPE)
EndLame = LameEncode.communicate()[0]

person tedm1106    schedule 01.08.2015    source источник
comment
В сценарии вы передаете файл в качестве параметра, но в коде Python вы передаете стандарт, что произойдет, если вы передадите его как параметр?   -  person Liam Haworth    schedule 01.08.2015
comment
Спасибо, да, передать файл через FLAC в качестве параметра - лучший вариант.   -  person tedm1106    schedule 05.08.2015


Ответы (1)


У меня была аналогичная проблема с преобразованием файлов flac в mp3, и я нашел однострочное решение bash здесь, который гласит:

for f in *.flac; do ffmpeg -i "$f" -aq 1 "${f%flac}mp3"; done

Я понимаю, что это не отвечает на вопрос, но это элегантное решение вашей проблемы.

person Ken Mercer    schedule 07.12.2020