Gstreamer多文件接收器wav文件拆分

Gstreamer多文件接收器wav文件拆分,gstreamer,Gstreamer,我在使用gstreamer录制流时遇到问题。 我必须分别写音频和视频,信号到达时插话。我有正常工作的视频,但仍然有wav文件的问题。 即使是gst启动中的简单管道也无法正常工作。我有一个wave文件,我正在尝试使用multifilesink拆分它: gst启动文件rc location=test.wav!多文件接收器位置=test2%d.wav下一个文件=4最大文件大小=512000 但最终的wav文件已损坏,而带有ts文件的同一管道正在工作正常: gst-launch-1.0 filesrc

我在使用gstreamer录制流时遇到问题。 我必须分别写音频和视频,信号到达时插话。我有正常工作的视频,但仍然有wav文件的问题。 即使是gst启动中的简单管道也无法正常工作。我有一个wave文件,我正在尝试使用multifilesink拆分它:
gst启动文件rc location=test.wav!多文件接收器位置=test2%d.wav下一个文件=4最大文件大小=512000 但最终的wav文件已损坏,而带有ts文件的同一管道正在工作正常:

gst-launch-1.0 filesrc location=test.ts!multifilesink location=test2%d.ts next file=4 max file size=2000000

multifilesink
不知道它拆分的数据的任何信息,因此它不会为它写入的每个文件添加头

您的
.ts
文件之所以能够工作,是因为它被设计为一种流式格式,其中每个单独的数据包都将被独立处理。因此,您可以随时“收听”流。解码器只需查找找到的下一个数据包报头,然后在那里开始解码(有关详细信息,请参阅

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

为了解决这个问题,你可以

  • 手动将
    .wav
    头从第一个文件复制到所有其他文件
  • 使用支持PCM文件的程序,或者直接使用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
    

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

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

现在转到脚本的作用:

  • 首先,我们将使用
    multifilesink
    创建一组
    .buff
    文件,每个文件的大小不超过1MB(
    gdppay
    将用其上限注释每个缓冲区;
    gst-launch
    -e
    标志将导致在进程过早终止时触发EOS,这在读取和解码internet流时非常有用)
  • for
    循环中的第二次
    gst启动
    调用获取一个
    .buff
    文件,使用
    gdpdepay
    解析GDP头(并将其剥离),添加一个WAV头并将结果写入
    .WAV
    文件

希望这是一个您可以接受的解决方案,因为我怀疑是否有办法通过一次
gst-launch
run来实现这一点。

使用gst-launch-1.0和gst-launch-0.10hi之间没有区别,您能解决这个问题吗?我想要未压缩的文件,所以不能使用mp3。复制头文件也不是个好主意,因为iles不知道它们有多长。是否有任何方法可以使用gstreamer将一个wav文件拆分为例如1分钟的部分?
#!/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