使用FLAC解码器和LAME Encoder使用Python转换FLAC文件

时间:2015-08-01 02:57:37

标签: python mp3 command-line-interface file-conversion flac

我目前正在尝试使用Python脚本进行自动化音乐库编目的项目,在疯狂之前我迫切需要帮助。对于初学者,我使用Linux(Arch Linux是具体的)。为了解释,我最近开始使用Morituri来破解我的CD收藏。我特别喜欢Mortituri脚本,因为它会三次检查文件,并立即生成FLAC文件。

以上系统运行正常,但我遇到了另一个问题。我喜欢我的PC的FLAC文件,但是对于移动设备,我需要MP3文件。我遇到了这个着名的小bash脚本:

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

我看到了这个很棒的小脚本,我知道必须有一些方法可以在python中复制它。所以我开始研究将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. 我怎样才能做到这一点?!

  3. 真的,任何使用简单命令的方法。喜欢ffmpeg的程序不是很容易理解(如何将LAME q值设置为0?不知道。)而其他python脚本对我来说是反向工程的长期(如flac2all)。

    在审核中,我们会接受任何帮助。只要它遵循我的规范:1。仅使用Linux的裸FLAC和LAME工具(没有sox或ffmpeg),2。脚本不会太长。 3.不创建临时WAV文件。 4.可以将任何Flac文件编码为MP3。我甚至不担心元数据。只是文件本身。

    请帮助!

    编辑08/05/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]
    

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,将flac文件转换为mp3,发现了一个单行bash解决方案here,内容为:

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

我很高兴这不能回答问题,但这是解决您问题的绝妙方法。