让gstreamer将音频流分成单个输出流中的多个连续但离散的文件?

时间:2017-05-12 19:46:32

标签: audio stdout gstreamer

我正在使用gstreamer(实际上是gst-launch-1.0)来接收音频并使用flacenc对其进行编码。此时,为了进行测试,命令行如下所示:

gst-launch-1.0 -q autoaudiosrc ! flacenc ! fdsink

这实际上是由一个单独的程序启动的,该程序通过子进程的标准输出获取FLAC本机格式数据。

现在,出于存档目的,我希望能够做的是将此音频流分段为多个有限持续时间的文件,例如:每分钟一个文件。我编写的代码可以完成解析流,分段音频帧,缓冲它们以及输出完整形式的FLAC文件所需的最小工作量。但是,从长远来看,一旦我归档了数百个流,我就会关注CPU负载。

主要问题是帧号。它具有可变长度编码,更糟糕的是,这需要为每个帧重新计算两个CRC。如果我能这样做,那会不会很好:

  1. 让gstreamer经常重置帧号,或者更好
  2. 让gstreamer在中途启动一个全新的文件吗?
  3. 后一种情况是理想的。如果我只是将其转储到文件中,它将不是一个有效的FLAC文件。在第一个段之后,读者会找到一个文件头,它需要一个帧头和呕吐。但我可以在接收代码中处理这个问题。

    我正在尝试弄清楚如何使用各种多路复用器和分割过滤器,但我尝试过的大多数组合都会导致此类错误:

    WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0
    

    我也知道我可以使用gstreamer库并且可能在我自己的代码中执行这样的操作,我保持音频源的运行并继续上下移动FLAC编码器。几个月前,我试图弄清楚如何编写链接到gstreamer API的程序,并且完全丢失了。我可能没有看到正确的文档。

    到目前为止,我还发现了一些聪明的方法,可以始终按照gstreamer命令行做我想做的事情。例如,我设法将元数据从fifo插入到tsmpeg流中。所以也许我可以通过类似stackoverflow用户的帮助以同样的方式解决这个问题。 :)

    澄清:我不希望gstreamer写多个文件。我希望它生成多个文件,但让它们连接到stdout并有一个完全独立的程序将它们分成文件。

1 个答案:

答案 0 :(得分:0)

splitmuxsink选择的默认复用器是mp4mux,它不支持flac。以muxer = matroskamux为例可以帮助您使用splitmuxsink。虽然你会把FLAC包含在matroska中,这可能是也可能不是你想要的。

虽然这可能还不行,但您可以尝试使用flacparse作为splitmuxsink中的复用程序,以避免使用容器。

同时,您始终可以使用容器进行拆分,然后使用sink属性删除容器。以下是生成5秒flac文件的示例管道。

gst-launch-1.0 audiotestsrc ! flacenc ! flacparse ! sm.audio_0 \
    splitmuxsink name=sm muxer=matroskamux \
                         location=audio%05d.flac \
                         max-size-time=5000000000 \
                         sink="matroskademux ! filesink"