我使用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
答案 0 :(得分:1)
multifilesink
对它所分割的数据一无所知,因此不会为它所写的每个文件添加标题。
您的.ts
文件工作的原因是因为它被设计为流式格式,其中每个单独的数据包将被独立处理。因此,人们可以随时调整。每当人们喜欢的时候到流。解码器将只查找它找到的下一个数据包标头并在那里开始解码(有关详细信息,请查看MPEG TS' wiki page。
然而,WAV
文件格式被设计为纯文件(而不是流式传输)格式。因此,文件开头只有一个标题。将该文件拆分为多个文件时,会丢失这些标头(该文件仅包含原始PCM数据)。
要解决该问题,您可以......
.wav
标题从第一个文件复制到所有其他文件使用另一种面向流的文件格式,如.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
运行来实现这一目标。