2011-09-18 137 views
2

這裏是我試圖複製命令:使用GStreamer + Python將FLAC轉換爲MP3?

gst-launch filesrc location=test.flac ! flacdec ! lame ! filesink location=test.mp3 

當我運行此命令時,它精美的作品。我試圖使用Pythong綁定來複制它,但沒有任何運氣。我不同意這兩種腳本得到任何錯誤,但預期他們不工作:

當我運行此腳本,我只是得到一個空的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) 

任何人都知道我在做什麼錯了?

回答

5

的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() 
+0

它的工作!謝謝!你不知道我花了多少時間試圖弄清楚這一點。 – Liam

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