我正在使用gstreamer(实际上是gst-launch-1.0)来接收音频并使用flacenc对其进行编码。此时,为了进行测试,命令行如下所示:
gst-launch-1.0 -q autoaudiosrc ! flacenc ! fdsink
这实际上是由一个单独的程序启动的,该程序通过子进程的标准输出获取FLAC本机格式数据。
现在,出于存档目的,我希望能够做的是将此音频流分段为多个有限持续时间的文件,例如:每分钟一个文件。我编写的代码可以完成解析流,分段音频帧,缓冲它们以及输出完整形式的FLAC文件所需的最小工作量。但是,从长远来看,一旦我归档了数百个流,我就会关注CPU负载。
主要问题是帧号。它具有可变长度编码,更糟糕的是,这需要为每个帧重新计算两个CRC。如果我能这样做,那会不会很好:
后一种情况是理想的。如果我只是将其转储到文件中,它将不是一个有效的FLAC文件。在第一个段之后,读者会找到一个文件头,它需要一个帧头和呕吐。但我可以在接收代码中处理这个问题。
我正在尝试弄清楚如何使用各种多路复用器和分割过滤器,但我尝试过的大多数组合都会导致此类错误:
WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0
我也知道我可以使用gstreamer库并且可能在我自己的代码中执行这样的操作,我保持音频源的运行并继续上下移动FLAC编码器。几个月前,我试图弄清楚如何编写链接到gstreamer API的程序,并且完全丢失了。我可能没有看到正确的文档。
到目前为止,我还发现了一些聪明的方法,可以始终按照gstreamer命令行做我想做的事情。例如,我设法将元数据从fifo插入到tsmpeg流中。所以也许我可以通过类似stackoverflow用户的帮助以同样的方式解决这个问题。 :)
澄清:我不希望gstreamer写多个文件。我希望它生成多个文件,但让它们连接到stdout并有一个完全独立的程序将它们分成文件。
答案 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"