即使录制意外中断(例如电源断开),如何在 gstreamer 中录制可播放的视频文件?
Posted
技术标签:
【中文标题】即使录制意外中断(例如电源断开),如何在 gstreamer 中录制可播放的视频文件?【英文标题】:How to record playable video files in gstreamer even if recording is interrupted unexpectedly (e.g. power disconnects)? 【发布时间】:2021-09-14 10:51:28 【问题描述】:我一直在使用类似这样的简单 gstreamer 管道在我的 Jetson Xavier NX 上录制视频流
gst-launch-1.0 -v \
nvarguscamerasrc sensor-id=0 ! \
'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)NV12, framerate=(fraction)30/1' ! \
nvv4l2h265enc ! 'video/x-h265, stream-format=(string)byte-stream' ! \
h265parse ! qtmux ! filesink location=video.mp4 -e
如果录制被键盘中断Ctrl + C
中断,则一切正常,但如果录制意外中断(例如断电),即使文件大小正确,生成的文件也没有可播放的流。
我知道需要正确停止 mp4 录制,否则文件末尾将没有必要的信息,但我想知道是否有任何其他 gstreamer 管道或最终文件格式允许 H265即使录制意外结束,编码的视频文件也可以播放。
即使录制的文件需要在播放之前进行转换(例如使用 ffmpeg)也很好,只要可以恢复信息而无需通过非免费的 mp4 恢复工具。
【问题讨论】:
您可以尝试其他“容器”格式,例如 AVI、FLV 或可能的 MKV。我会先尝试 FLV,因为它是用于流式传输的,因此它会以逐帧数据包的形式构建视频(如果断电,那么您将拥有一个播放到最新帧/数据包的 FLV在电源问题发生之前写的)...尝试一下。我不使用 GStreamer,所以不确定它是否设计为也可以逐帧写入,或者它会等到所有数据可用以生成输出 FLV。 FFmpeg 将逐帧写入 FLV。将 FLV 设置为包含 H264(与 MP4 相同的视频编解码器)... 谢谢!事实上,我最终所做的并为我工作的是使用matroskamux
而不是 qtmux
并保存到 mkv 文件。我现在不知道如何使用 gstreamer 保存到 flv,因为我是初学者,但如果我再次需要它,我会再次研究它
【参考方案1】:
检查qtmux/mp4mux
元素属性moov-recovery-file
:
moov-recovery-file : File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental)
flags: readable, writable
String. Default: null
属于那个的是qtmoovrecover
元素。如果您已使用原始管道保存了恢复文件并想要恢复损坏的文件,您应该能够通过创建仅包含该元素的基本管道来实现。它采用损坏的输入文件、恢复文件和输出文件作为参数,并有望修复您的录音。
请注意,此功能被标记为实验性。
【讨论】:
非常感谢,这很有帮助!最后对我有用的是使用matroskamux
并保存到 mkv 文件,但如果我需要它用于 mp4,我会记住这一点以上是关于即使录制意外中断(例如电源断开),如何在 gstreamer 中录制可播放的视频文件?的主要内容,如果未能解决你的问题,请参考以下文章
vb2010 (vb.net )Socket套接字当网络中断时或服务器意外关机,客户端如何自动重新连接服务端