Gstreamer multifilesink wav 文件分割

标签 gstreamer

我在使用 gstreamer 录制流时遇到问题。 我必须将音频和视频分开编写,并在信号到达时切入。我有正常工作的视频,但仍然有 wav 文件的问题。 即使是 gst-launch 中的简单管道也无法正常工作。我有 wave 文件,我正在尝试使用 multifilesink 拆分它:
gst-launch filesrc location=test.wav ! multifilesink location=test2%d.wav next-file=4 max-file-size=512000 但是最终的 wav 文件已损坏,而与 ts 文件相同的管道工作正常:
gst-launch-1.0 filesrc location=test.ts ! multifilesink location=test2%d.ts next-file=4 max-file-size=2000000

最佳答案

multifilesink 对它拆分的数据一无所知,因此它不会为它写入的每个文件添加 header 。

您的 .ts 文件之所以有效,是因为它被设计为一种流格式,其中每个单独的数据包都将被独立处理。因此,人们可以随时“收听”流。解码器将简单地寻找它找到的下一个数据包头并在那里开始解码(有关详细信息,请查看 MPEG TS' wiki page

不过,WAV 文件格式被设计为纯文件(而非流媒体)格式。因此,文件的开头只有一个标题。当您将该文件拆分为多个文件时,这些 header 将丢失(该文件仅包含原始 PCM 数据)。

要解决该问题,您可以...

  • 手动将 .wav header 从第一个文件复制到所有其他文件
  • 使用支持 PCM 文件的程序并直接使用它们或转换文件(不过在打开这些文件时您必须手动设置 channel 数、采样率和比特率)。
  • 使用另一种面向流的文件格式,如 .mp3,它来自与 .ts 相同的编解码器系列,并且还为每个帧使用单独的 4 字节 header (请记住尽管 MP3 是一种有损文件格式)。
    一个示例管道是:

    gst-launch filesrc location=test.wav ! wavparse ! lame ! multifilesink location=test%d.mp3 next-file=4 max-file-size=100000
    

关于Gstreamer multifilesink wav 文件分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25662392/

相关文章:

gstreamer - gstreamer 中 Action 信号与查询的目的是什么?

python-2.7 - 如何访问 Gstreamer 注册表以以编程方式获取可用插件的列表

python - 将 Gstreamer 与 Kivy 结合使用

c - 使用 gstreamer 插件检测音频峰值

gstreamer - gst-launch-1.0 videotestsrc ! autovideosink(对我不起作用!)

gstreamer - 使用 gst-launch 播放原始视频

rust - 为 gstreamer crate 0.14 编写 rust/gstreamer 插件需要哪些依赖项?

c++ - 如何在 gstreamer 插件中使用 c++ 模块?

c# - 在Gstreamer(C#)中使用管道播放音频

android 内部套接字连接因守护进程服务失败