我发现使用 Gstreamer 转储相同的视频文件(链接:https://drive.google.com/file/d/1KaVXUMzLBKF8vOwy-QR1VCjRujEOHhFi/view?usp=sharing):
gst-launch-1.0 filesrc location=video.avi ! decodebin ! videoconvert | pngenc ! multifilesink location=gstreamer_frames/"frame_%d.png"
与使用等效的 ffmpeg 命令相比,给出的图像略有不同
ffmpeg -i video.avi ffmpeg_frames/frame_%d.png
可以使用 Python 检查差异:
>>> import cv2
>>> ffmpeg_image = cv2.imread("ffmpeg_frames/frame_280.png")
>>> gstreamer_image = cv2.imread("gstreamer_frames/frame_280.png")
>>> ffmpeg_image == gstreamer_image
>>> gstreamer_image[-1, -5:, 0]
array([12, 6, 4, 0, 0], dtype=uint8)
>>> ffmpeg_image[-1, -5:, 0]
array([13, 8, 5, 2, 2], dtype=uint8)
是否可以使用 Gstreamer 和 FFMPeg 获得完全相同的输出?
您可以尝试将解码器显式设置为管道中的 ffmpeg 风格之一吗?也许decodebin正在使用另一个解码器
例如 mpeg4
gst-launch-1.0 filesrc location=video.avi ! avidemux ! avdec_mpeg4 ! videoconvert ! pngenc ! multifilesink location=gstreamer_frames/"frame_%d.png"