【问题标题】:Get gstreamer to split audio stream into multiple concatenated but discrete files in single output stream?让 gstreamer 将音频流拆分为单个输出流中的多个连接但离散的文件?
【发布时间】:2017-10-12 05:27:20
【问题描述】:

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

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

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

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

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

  1. 让 gstreamer 经常重置帧号,甚至更好
  2. gstreamer 是否在中途启动了一个全新的文件?

后一种情况是理想的。如果我只是将它转储到一个文件中,它就不是一个有效的 FLAC 文件。在第一段之后,阅读器会在需要帧头和呕吐的地方找到一个文件头。但我可以在接收代码中处理它。

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

WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0

我也知道我可以使用 gstreamer 库,并且可能在我自己的代码中执行类似的操作,在该代码中我保持音频源正常运行并不断调整 FLAC 编码器。几个月前,我试图大致弄清楚如何编写链接到 gstreamer API 的程序,结果完全迷失了方向。我可能没有查看正确的文档。

到目前为止,我还找到了一些巧妙的方法来始终使用 gstreamer 命令行执行我想做的事情。例如,我设法将元数据从 fifo 插入到 tsmpeg 流中。所以也许我可以设法以同样的方式解决这个问题,在友好的 stackoverflow 用户的帮助下。 :)

澄清:我不希望 gstreamer 写入多个文件。我希望它生成多个文件,但通过标准输出将它们连接起来,并有一个完全独立的程序将它们拆分为文件。

【问题讨论】:

    标签: audio stdout gstreamer


    【解决方案1】:

    splitmuxsink默认选择的muxer是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"
    

    【讨论】:

    • 感谢您的建议。我不确定哪里出了问题,但这只会产生一个文件。 audio00000.flac 生成并且是请求的持续时间。 audio00001.flac 已创建,但始终为零。这就是我将持续时间设置为一秒的原因。
    • 您好。我目前正在实现一个使用 Google Speech to Text 即时创建字幕的工具,但是,我必须使用与您的解决方案非常相似的解决方案,因为我无法直接在 ram 上拆分我的文件。我将flacs拆分到RAM目录中,然后将它们推送到Google,但是,我想直接使用管道和appsrc/appsinks来完成。 splitmuxsink 是如何测量时间的,所以我可以实现一些短队列,让我可以做到这一点?另外,我需要在下一个文件的开头连接每个文件的最后一秒音频,以避免由于截断而丢失单词
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2019-11-26
    相关资源
    最近更新 更多