首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GStreamer + Python将FLAC转换成MP3?

用GStreamer + Python将FLAC转换成MP3?
EN

Stack Overflow用户
提问于 2011-09-18 11:24:30
回答 2查看 2.4K关注 0票数 3

下面是我正在尝试复制的命令:

代码语言:javascript
复制
gst-launch filesrc location=test.flac ! flacdec ! lame ! filesink location=test.mp3

当我运行这个命令时,它工作得很好。我尝试过使用Pythong绑定来复制它,但一点也没有成功。我没有在这两个脚本中得到任何错误,但它们并不能像预期的那样工作:

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

代码语言:javascript
复制
import gst
pipeline = gst.parse_launch('filesrc location="test.flac" ! flacdec ! lame ! filesink location="test.mp3"')
pipeline.set_state(gst.STATE_PLAYING)

当我运行这个脚本时,我得到一个损坏的MP3文件:

代码语言:javascript
复制
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)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-18 15:27:03

Gstreamer使用GObject作为框架,因此您需要运行gobject.MainLoop()来启动管道中的消息流:

代码语言:javascript
复制
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

以下是更正后的代码:

代码语言:javascript
复制
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()
票数 6
EN

Stack Overflow用户

发布于 2017-02-10 04:19:43

有些人最终选择了这个答案,寻找命令行/ bash解决方案。下面是一个很好的转换脚本。

代码语言:javascript
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7459295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档