即使录制意外中断(例如电源断开),如何在 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 恢复工具。

【问题讨论】:

您可以尝试其他“容器”格式,例如 AVIFLV 或可能的 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套接字当网络中断时或服务器意外关机,客户端如何自动重新连接服务端

CallKit + WebRTC:在 iOS 中按下锁定/电源按钮时 CallKit 通话断开

音频会话中断后恢复 twilio 通话

防止远程操作中断的杀手工具--GNUScreen

如何避免关键程序被意外关闭?

如果被短信、推送通知或电池电量不足等 uialert 中断,如何自动继续录制