Gstreamer multifilesink wav文件分裂

时间:2014-09-04 09:52:31

标签: gstreamer

我使用gstreamer录制流时遇到问题。 我必须单独写音频和视频,并在信号到达时切入。我有正确的视频工作,但仍然有wav文件的问题。 即使是gst-launch中的简单管道也无法正常工作。我有波形文件,我试图使用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

2 个答案:

答案 0 :(得分:1)

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

您的.ts文件工作的原因是因为它被设计为流式格式,其中每个单独的数据包将被独立处理。因此,人们可以随时调整。每当人们喜欢的时候到流。解码器将只查找它找到的下一个数据包标头并在那里开始解码(有关详细信息,请查看MPEG TS' wiki page

然而,WAV文件格式被设计为纯文件(而不是流式传输)格式。因此,文件开头只有一个标题。将该文件拆分为多个文件时,会丢失这些标头(该文件仅包含原始PCM数据)。

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

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

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

答案 1 :(得分:0)

如果您也愿意使用某些脚本并将任务分成不同的gst-launch来电,我可以为您提供另一种解决您的小问题的方法:

以下脚本是Linux bash脚本。您应该能够将其转换为Windows批处理脚本(或者如果需要,可以转换为C或python应用程序):

#!/bin/bash -e

# First write the buffer stream to .buff files (annotated using GStreamer's GDP format)
gst-launch -e filesrc location=test.wav ! wavparse ! gdppay ! multifilesink next-file=4 max-file-size=1000000 location=foo%05d.buff

# use the following instead for any other source (e.g. internet radio streams)
#gst-launch -e uridecodebin uri=http://url.to/stream ! gdppay ! multifilesink next-file=4 max-file-size=1000000 location=foo%05d.buff

# After we're done, convert each of the resulting files to proper .wav files with headers
for file in *.buff; do
    tgtFile="$(echo "$file"|sed 's/.buff$/.wav/')"

    gst-launch-0.10 filesrc "location=$file" ! gdpdepay ! wavenc ! filesink "location=$tgtFile"
done

# Uncomment the following line to remove the .buff files here, but to avoid accidentally 
# deleting stuff we haven't properly converted if something went wrong, I'm not gonna do that now.
#rm *.buff

现在脚本的作用:

  • 首先,我们将使用multifilesink创建一组.buff个文件,每个文件的大小不超过1MB(gdppay将使用其大写注释每个缓冲区; {{ 1}} -e的标志会导致它过早地被杀死时触发EOS,如果您正在读取和解码互联网流,这将非常有用。)
  • gst-launch循环中的第二个gst-launch调用会获取for个文件之一,使用.buff解析GDP标头(并剥离它们),添加一个WAV标头并将结果写入gdpdepay文件。

希望这是一个你可以接受的解决方案,因为我怀疑是否可以通过一次.wav运行来实现这一目标。