Конвертировать FLAC в MP3 с GStreamer + Python? - PullRequest
3 голосов
/ 18 сентября 2011

Вот команда, которую я пытаюсь повторить:

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)

Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 18 сентября 2011

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 голосов
/ 09 февраля 2017

Некоторые люди приходят к этому ответу в поисках решения для командной строки / 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
...