【发布时间】:2017-10-12 05:27:20
【问题描述】:
我正在使用 gstreamer(实际上是 gst-launch-1.0)接收音频并使用 flacenc 对其进行编码。此时,为了测试,命令行如下所示:
gst-launch-1.0 -q autoaudiosrc ! flacenc ! fdsink
这实际上是由一个单独的程序启动的,该程序通过子进程的标准输出获取 FLAC 原生格式数据。
现在,出于存档目的,我希望能够将此音频流分段为多个持续时间有限的文件,例如每分钟一个文件。我编写的代码可以完成解析流、分段音频帧、缓冲它们和输出完整格式的 FLAC 文件所需的最少工作。但是,从长远来看,一旦归档数百个流,我会担心 CPU 负载。
主要问题是帧数。它具有可变长度编码,更糟糕的是,这需要为每一帧重新计算两个 CRC。如果我也可以,那不是很好吗:
- 让 gstreamer 经常重置帧号,甚至更好
- gstreamer 是否在中途启动了一个全新的文件?
后一种情况是理想的。如果我只是将它转储到一个文件中,它就不是一个有效的 FLAC 文件。在第一段之后,阅读器会在需要帧头和呕吐的地方找到一个文件头。但我可以在接收代码中处理它。
我正在努力弄清楚如何使用各种多路复用器和拆分过滤器,但我尝试过的大多数组合都导致了此类错误:
WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0
我也知道我可以使用 gstreamer 库,并且可能在我自己的代码中执行类似的操作,在该代码中我保持音频源正常运行并不断调整 FLAC 编码器。几个月前,我试图大致弄清楚如何编写链接到 gstreamer API 的程序,结果完全迷失了方向。我可能没有查看正确的文档。
到目前为止,我还找到了一些巧妙的方法来始终使用 gstreamer 命令行执行我想做的事情。例如,我设法将元数据从 fifo 插入到 tsmpeg 流中。所以也许我可以设法以同样的方式解决这个问题,在友好的 stackoverflow 用户的帮助下。 :)
澄清:我不希望 gstreamer 写入多个文件。我希望它生成多个文件,但通过标准输出将它们连接起来,并有一个完全独立的程序将它们拆分为文件。
【问题讨论】: