用GStreamer和Python将FLAC转换为MP3?
这是我想要复制的命令:
gst-launch filesrc location=test.flac ! flacdec ! lame ! filesink location=test.mp3
当我运行这个命令时,它效果很好。我尝试用Python的绑定来复制这个命令,但完全没有成功。我运行这两个脚本时没有任何错误,但它们的效果并不如我所期待:
当我运行这个脚本时,我只得到一个空的MP3文件:
import gst
pipeline = gst.parse_launch('filesrc location="test.flac" ! flacdec ! lame ! filesink location="test.mp3"')
pipeline.set_state(gst.STATE_PLAYING)
当我运行这个脚本时,我得到一个损坏的MP3文件:
import gst
converter = gst.Pipeline('converter')
source = gst.element_factory_make('filesrc', 'file-source')
source.set_property('location', 'test.flac')
decoder = gst.element_factory_make('flacdec', 'decoder')
encoder = gst.element_factory_make('lame', 'encoder')
sink = gst.element_factory_make('filesink', 'sink')
sink.set_property('location', 'test.mp3')
converter.add(source, decoder, encoder, sink)
source.link(sink)
converter.set_state(gst.STATE_PLAYING)
有人知道我哪里出错了吗?
2 个回答
0
有些人可能会看到这个答案,是在寻找命令行或bash的解决方案。这里有一个不错的转换脚本。
#!/bin/bash
#Take a lossless flac audio track from and transcode it as a constant rate mp3 playable on some older audio equipment that can't play mp4s or variable bit rate mp3's.
if [ -z "$1" ];then
echo usage: $0 [infile.flac]
exit
fi
INFILE=$(basename $1)
WKDIR=$(dirname $1)
OUTFILE=$WKDIR/$( echo $INFILE | sed 's/\.flac//').mp3
#play ===================
#gst- launch filesrc location=1.flac \
#! flacdec \
#! autoaudiosink
#transcode ==============
gst-launch filesrc location=$INFILE \
! queue \
! flacdec \
! audioconvert \
! audioresample \
! lamemp3enc quality=2 target=bitrate bitrate=192 cbr=true \
! id3v2mux \
! filesink location=$OUTFILE
6
Gstreamer使用GObject作为框架,所以你需要运行 gobject.MainLoop()
来启动管道中的消息流:
import gobject
import gst
pipeline = gst.parse_launch('filesrc location="test.flac" ! flacdec ! lame ! filesink location="test.mp3"')
pipeline.set_state(gst.STATE_PLAYING)
gobject.threads_init()
gobject.MainLoop().run()
在第二个例子中,你也需要运行MainLoop,并且要把所有的管道元素连接起来(比如用 element_link_many
)。你只把源连接到了接收端,所以你的实际管道就是 filesrc ! filesink
。
这里是修正后的代码:
import gobject
import gst
converter = gst.Pipeline('converter')
source = gst.element_factory_make('filesrc', 'file-source')
source.set_property('location', 'test.flac')
decoder = gst.element_factory_make('flacdec', 'decoder')
encoder = gst.element_factory_make('lame', 'encoder')
sink = gst.element_factory_make('filesink', 'sink')
sink.set_property('location', 'test.mp3')
converter.add(source, decoder, encoder, sink)
gst.element_link_many(source, decoder, encoder, sink)
converter.set_state(gst.STATE_PLAYING)
gobject.threads_init()
gobject.MainLoop().run()