我在使用 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
multifilesink
对它所分割的数据一无所知,因此它不会负责向它写入的每个文件添加标头。
你的原因.ts
文件之所以有效,是因为它被设计为流格式,其中每个单独的数据包将被独立处理。因此,人们可以随时“收听”该流。解码器将简单地查找它找到的下一个数据包标头并在那里开始解码(有关详细信息,请查看MPEG TS 的 wiki 页面 http://en.wikipedia.org/wiki/MPEG_transport_stream.
The 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)