使用GStreamer+;python

使用GStreamer+;python,python,audio,gstreamer,Python,Audio,Gstreamer,下面是我试图复制的命令: gst-launch filesrc location=test.flac ! flacdec ! lame ! filesink location=test.mp3 当我运行这个命令时,它工作得很好。我尝试使用Pythong绑定复制它,但一点运气都没有。我没有发现这些脚本中的任何错误,但它们不能按预期工作: 当我运行此脚本时,我只得到一个空的MP3文件: 进口商品及服务税 pipeline=gst.parse_launch('filesrc location=“te

下面是我试图复制的命令:

gst-launch filesrc location=test.flac ! flacdec ! lame ! filesink location=test.mp3
当我运行这个命令时,它工作得很好。我尝试使用Pythong绑定复制它,但一点运气都没有。我没有发现这些脚本中的任何错误,但它们不能按预期工作:

当我运行此脚本时,我只得到一个空的MP3文件:

进口商品及服务税
pipeline=gst.parse_launch('filesrc location=“test.flac”!flacdec!lame!filesink location=“test.mp3”'))
管道。设置状态(gst。状态)
运行此脚本时,我得到一个损坏的MP3文件:

进口商品及服务税
converter=gst.Pipeline('converter')
source=gst.element\u factory\u make('filesrc','file source')
source.set_属性('location','test.flac'))
解码器=商品及服务税。元件工厂制造('flacdec','decoder')
编码器=商品及服务税。元件\工厂\制造商('lame','encoder')
sink=gst.element\u factory\u make('filesink','sink'))
sink.set_属性('location','test.mp3'))
添加(源、解码器、编码器、接收器)
源链接(接收器)
转换器。设置状态(gst。状态)

有人知道我做错了什么吗?

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\u link\u many
)。 您只将源连接到接收器,所以实际的管道只是
filesrc!文件链接

下面是更正的代码:

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()

有些人最终得到了这个答案,寻找命令行/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

成功了!非常感谢。你不知道我花了多少时间想弄明白。