Gstreamer多文件接收器wav文件拆分
我在使用gstreamer录制流时遇到问题。 我必须分别写音频和视频,信号到达时插话。我有正常工作的视频,但仍然有wav文件的问题。 即使是gst启动中的简单管道也无法正常工作。我有一个wave文件,我正在尝试使用multifilesink拆分它: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
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文件,或者转换文件(但在打开这些文件时,必须手动设置通道计数、采样率和比特率)
- 使用另一种面向流的文件格式,如
,它与.ts来自同一个编解码器系列,并且还为每个帧使用单独的4字节头(请记住,尽管mp3是一种有损文件格式)。.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
文件,每个文件的大小不超过1MB(.buff
将用其上限注释每个缓冲区;gdppay
的gst-launch
标志将导致在进程过早终止时触发EOS,这在读取和解码internet流时非常有用)-e
循环中的第二次for
调用获取一个gst启动
文件,使用.buff
解析GDP头(并将其剥离),添加一个WAV头并将结果写入gdpdepay
文件.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