使用 gstreamer 修复来自网络摄像头的未混合图像/jpeg 流

使用 gstreamer 修复来自网络摄像头的未混合图像/jpeg 流

我使用以下管道制作了一个破碎的镜头:

gst-launch-1.0 v4l2src ! filesink location=encode.mjpeg

但 gstreamer 仍然可以播放它:

gst-launch-1.0 filesrc location=encode.mjpeg ! jpegdec ! videoconvert ! xvimagesink

但是由于我错误地没有使用任何容器,流以非常快的速度播放framerate=(fraction)0/1。有没有办法将损坏的文件转换为.avi或任何其他容器而无需重新压缩?

以下简单的多路复用未能按预期工作:

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! avimux \
    ! filesink location=encode.avi . -v

不知何故,gstreamerencode.avi以 ~1 FPS 的速度非常缓慢地播放,而不会消耗大量 CPU。而且 Vlc` 和 Adob​​e Aftereffects 都无法导入它 - 它们只在顶部显示正确解码的第一帧的条纹。

答案1

您在将视频多路复用为 avi 时遇到的问题与以下事实有关:filesrc 为 avimux 提供的缓冲区未与 mjpeg 帧正确对齐,因此 avimux 在内部创建了错误对齐的样本,这使得播放器在播放过程中更难使用它们。

可以通过在 capsfilter (jpegparse?) 后使用 mjpeg 解析器来修复此问题。另一个选项是解码并重新编码样本,以使其正确对齐和复用。以下管道应该可以工作:

gst-launch-1.0 filesrc location=encode.mjpeg \
! 'image/jpeg,framerate=30/1,width=1280,height=720' ! decodebin ! videoconvert ! \
<some encoder> ! <some muxer> ! filesink location=outputfile

您可以选择您喜欢的编码器和复用器,您甚至可以将它们编码回 jpeg 并复用为 avi,就像您最初想要的那样。

编辑:要尝试将内容混合到 avi 中而不进行解码,请尝试以下操作:

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! jpegparse ! avimux \
    ! filesink location=encode.avi . -v

如果 jpegparse 能够很好地完成工作,则不需要 ''image/jpeg,framerate=30/1,width=1280,height=720''。

相关内容