gstreamer 将多通道 wav 文件拆分为单独的通道并将每个通道编码为 mp3、alac 等并保存到文件

Posted

技术标签:

【中文标题】gstreamer 将多通道 wav 文件拆分为单独的通道并将每个通道编码为 mp3、alac 等并保存到文件【英文标题】:gstreamer split multi-channel wav file into separate channels and encode each channel as mp3, alac etc and save to file 【发布时间】:2014-02-07 05:02:13 【问题描述】:

我需要拆分一个多声道的wav文件,并将每个声道编码成mp3文件。

我知道 gtresamer 的 deinterleave 插件,但我不确定如何将它用于 wav 文件以及如何对频道流进行编码。

我更喜欢基于 gtreamer(或 ffmpeg)的解决方案,因为我需要限制 I/O。即,我不希望将中间单通道 wav 文件写入存储。

ffmpeg 可用于this way。但是,ubuntu ffmpeg 中没有这两个开关。

snsonic 的解决方案抛出以下错误:

(gst-launch-0.10:2218): GStreamer-WARNING **: Failed to load plugin '/usr/lib/gstreamer-0.10/libgstpng.so': libpng12.so.0: cannot open shared object file: No such file or directory

Setting pipeline to PAUSED ...

Pipeline is PREROLLING ...

ERROR: from element /GstPipeline:pipeline0/GstWavParse:wavparse0: Internal data flow error.

Additional debug info:

gstwavparse.c(1982): gst_wavparse_loop (): /GstPipeline:pipeline0/GstWavParse:wavparse0:

streaming task paused, reason not-linked (-1)

ERROR: pipeline doesn't want to preroll.

Setting pipeline to NULL ...

Freeing pipeline ...



    (gst-launch-0.10:2218): GStreamer-CRITICAL **: gst_caps_unref: assertion `GST_CAPS_REFCOUNT_VALUE (caps) > 0' failed    

当我使用没有去交错的单通道 wav 文件进行测试时,创建了 mp3 文件但它只有噪音。

【问题讨论】:

【参考方案1】:

你提前知道频道的数量吗? 如果你使用 gst-launch,你可以做类似的事情:

gst-launch-1.0 filesrc location="xx.wav" ! wavparse ! deinterleave name=d \
  d.src_01 ! <encoder> ! filesink location="out1.mp3" \
  d.src_02 ! <encoder> ! filesink location="out2.mp3"

等等。如果事先不知道通道数,则需要编写一些代码。

【讨论】:

【参考方案2】:

FFmpeg 可能会满足您的要求。

【讨论】:

【参考方案3】:

您不必事先知道 wav 文件有多少个频道。 您需要安装 sox

#!/bin/bash
INPUT=$1

fbname=$(basename "$INPUT" .wav)

N=`soxi -c $INPUT`

for i in $(seq 1 $N)
do
    sox $INPUT "$fbname-$i.wav" remix $i
    avconv -i "$fbname-$i.wav" -f mp2 "$fbname-$i.mp3"
    rm $fbname-$i.wav

done

您可能希望将 avconv 替换为 ffmpeg,具体取决于您正在处理的发行版。

【讨论】:

以上是关于gstreamer 将多通道 wav 文件拆分为单独的通道并将每个通道编码为 mp3、alac 等并保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将 WAV 从立体声转换为单声道?

将 G.723.1 转换为普通 wav 和拆分通道?

如何在 Windows 上使用 gstreamer 播放 .wav 音频文件?

将wav文件转换为单声道

在 C 中将立体声 wav 转换为单声道

gstreamer:没有可用于“audio/x-wav”类型的解码器/找不到合适的插件