В настоящее время я пытаюсь выполнить проект по автоматизации каталогизации моей музыкальной библиотеки с помощью сценариев 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
Итак, у меня есть несколько вопросов:
Почему FLAC ведет себя таким образом? При тестировании скрипта я указал путь к реальному файлу FLAC. Почему оно говорит это?
Как я могу заставить это работать?!
Действительно, любой способ с помощью простых команд. Такие программы, как 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]