使用gstreamer提取GIF帧

时间:2018-08-26 13:38:52

标签: rust gstreamer gif

我正在尝试使用带有AppSrc和AppSink的gstreamer提取任何视频(包括GIF)的帧。我在Rust(使用gstreamer板条箱)中遇到的最小错误管道是:

a()

这可以与我测试过的各种视频甚至图像一起使用,但是对于任何GIF来说,它只会在let buf = /* All in memory for the moment */; let app_src = ElementFactory::make("appsrc", None).unwrap(); let decodebin = ElementFactory::make("decodebin", None).unwrap(); let app_sink = ElementFactory::make("appsink", None).unwrap(); let pipeline = Pipeline::new(); pipeline.add_many(&[&app_src, &decodebin, &app_sink]).unwrap(); app_src.link(&decodebin).unwrap(); let buf = GstRc::from_slice(buf).unwrap(); let app_src = app_src.downcast::<AppSrc>().unwrap(); app_src.push_buffer(buf).into_result().unwrap(); app_src.end_of_stream().into_result().unwrap(); let app_sink = app_sink.downcast::<AppSink>().unwrap(); app_sink.set_caps(Some(&Caps::from_str(&"video/x-raw")).unwrap())); app_sink.set_sync(false); app_sink.set_wait_on_eos(true); let app_sink2 = app_sink.clone(); decodebin.connect_pad_added(move |decodebin, _| { let _ = decodebin.link(&app_sink2); }); pipeline.set_state(State::Playing).into_result().unwrap(); pipeline .get_state(CLOCK_TIME_NONE) .0 .into_result() .unwrap() /* Pull each frame through with app_sink.pull_sample() */ 上出错。 pipeline.get_state()显示:

GST_DEBUG=4

错误为0:00:18.929304768 27027 0x7f48746d8050 INFO libav gstavdemux.c:1314:gst_ffmpegdemux_open:<avdemux_gif0:video_0> stream tags: taglist, video-codec=(string)"GIF\ \(Graphics\ Interchange\ Format\)"; 0:00:18.929353999 27027 0x7f48746d8050 WARN libav gstavdemux.c:1603:gst_ffmpegdemux_loop:<avdemux_gif0> av_read_frame returned -5 0:00:18.929370474 27027 0x7f48746d8050 WARN libav gstavdemux.c:1590:gst_ffmpegdemux_loop:<avdemux_gif0> error: Internal data stream error. 0:00:18.929383308 27027 0x7f48746d8050 WARN libav gstavdemux.c:1590:gst_ffmpegdemux_loop:<avdemux_gif0> error: streaming stopped, reason error (-5) 0:00:18.929371274 27027 0x7f48746d8680 INFO videodecoder gstvideodecoder.c:1330:gst_video_decoder_sink_event_default:<avdec_gif0> upstream tags: taglist, video-codec=(string)"GIF\ \(Graphics\ Interchange\ Format\)"; 0:00:18.929406505 27027 0x7f48746d8050 INFO GST_ERROR_SYSTEM gstelement.c:2145:gst_element_message_full_with_details:<avdemux_gif0> posting message: Internal data stream error. 0:00:18.929462537 27027 0x7f48746d8050 INFO GST_ERROR_SYSTEM gstelement.c:2172:gst_element_message_full_with_details:<avdemux_gif0> posted error message: Internal data stream error. av_read_frame returned -5不会显示有关该错误的更多详细信息。奇怪的是,GST_DEBUG=5的工作原理:

gst-launch

使用gst-launch-1.0 filesrc location=test.gif ! decodebin ! video/x-raw ! fakesink 运行该命令不会引起任何意外,除非没有错误。我尝试了一些不同的操作,例如在播放前进行预滚动,但是我知道为什么在特定的情况下它不起作用。谁能给我一些指示?

我已经安装了所有gst-plugins- *以及gst-libav。我在ArchLinux上使用gstreamer 1.14.2。

1 个答案:

答案 0 :(得分:1)

对于遇到类似问题的任何人:GIF解码仅适用于基于拉式的AppSrc。 GIF似乎是唯一流行的Web格式(例如jpg,png,webms,mp4等),不适用于基于推送的AppSrc API。