我使用以下管道制作了一个破碎的镜头:
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` 和 Adobe 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''。