0

我试图让以下管道在 gstreamer-java 中工作(使用 gstreamer-0.10):

“gst-launch-0.10 filesrc location=big_buck_bunny_480p_surround-fix.avi!decodebin2!ffmpegcolorspace!autovideosink”

此管道在命令行上工作。运行 ubuntu 14.04 LTS 的机器 vbox vm

任何人都可以帮助我确定我的问题可能与 Java 代码中的管道有关吗?

java代码如下:

公共静态无效主要(字符串[]参数){

args = Gst.init("AppSrcTest", args);
/* setup pipeline */
pipeline = new Pipeline("pipeline");
final AppSrc appsrc = (AppSrc) ElementFactory.make("appsrc", "appsrc");

final Element decodebin = ElementFactory.make("decodebin2", null);
final Element ffmpegcolorspace = ElementFactory.make("ffmpegcolorspace", "formatConverter");

SwingUtilities.invokeLater(new Runnable() {

    public void run() {             
        JFrame frame = new JFrame("FakeSrcTest");
        VideoComponent panel = new VideoComponent();
        panel.setPreferredSize(new Dimension(width, height));
        frame.add(panel, BorderLayout.CENTER);
        Element videosink = panel.getElement();

        pipeline.addMany(appsrc, decodebin,ffmpegcolorspace, videosink);
        Element.linkMany(appsrc, decodebin,ffmpegcolorspace, videosink);

        appsrc.setTimestamp(true);

        appsrc.set("emit-signals", true);
        appsrc.connect(new AppSrc.NEED_DATA() {                    
            public void needData(AppSrc elem, int size) {
                try {
                    //other code    
                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

                    }
                    System.out.println("Data collected..");
                    Buffer buffer = new Buffer(outputStream.toByteArray().length);
                    buffer.getByteBuffer().put(outputStream.toByteArray());
                    appsrc.pushBuffer(buffer);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

当我开始收到错误时,调试信息如下:

0:00:06.194558872 [332m14803[00m 0x7f24dc038680 [32;01mINFO   [00m [00;01;37;41m    GST_ELEMENT_PADS gstelement.c:728:gst_element_add_pad:<decodebin20>[00m adding pad 'src0'
0:00:06.194682253 [332m14803[00m 0x7f24dc038680 [32;01mINFO   [00m [00;01;37;41m    GST_ELEMENT_PADS gstelement.c:728:gst_element_add_pad:<decodebin20>[00m adding pad 'src1'
0:00:06.194765369 [332m14803[00m 0x7f24dc038680 [32;01mINFO   [00m [00;01;31m          GST_STATES gstbin.c:2942:bin_handle_async_done:<decodebin20>[00m committing state from READY to PAUSED, old pending PAUSED
0:00:06.194824176 [332m14803[00m 0x7f24dc038680 [32;01mINFO   [00m [00;01;31m          GST_STATES gstbin.c:2962:bin_handle_async_done:<decodebin20>[00m completed state change, pending VOID
0:00:06.194877892 [332m14803[00m 0x7f24dc038680 [32;01mINFO   [00m [00;01;31m          GST_STATES gstelement.c:2365:_priv_gst_element_state_changed:<decodebin20>[00m notifying about state-changed READY to PAUSED (VOID_PENDING pending)
Got TAG event
Tag audio-codec = Dolby Digital (AC-3)
Tag bitrate = 448000
0:00:06.212171413 [332m14803[00m 0x7f24dc038680 [32;01mINFO   [00m [00m              a52dec gsta52dec.c:439:gst_a52dec_reneg:<a52dec0>[00m reneg channels:6 rate:48000
0:00:06.258920113 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
0:00:06.259312652 [332m14803[00m 0x7f24dc043450 [32;01mINFO   [00m [00m             basesrc gstbasesrc.c:2562:gst_base_src_loop:<appsrc>[00m pausing after gst_pad_push() = not-linked
0:00:06.259366067 [332m14803[00m 0x7f24dc043450 [33;01mWARN   [00m [00m             basesrc gstbasesrc.c:2625:gst_base_src_loop:<appsrc>[00m error: Internal data flow error.
0:00:06.259383885 [332m14803[00m 0x7f24dc043450 [33;01mWARN   [00m [00m             basesrc gstbasesrc.c:2625:gst_base_src_loop:<appsrc>[00m error: streaming task paused, reason not-linked (-1)
0:00:06.259418691 [332m14803[00m 0x7f24dc043450 [32;01mINFO   [00m [00;01;31;47m    GST_ERROR_SYSTEM gstelement.c:1964:gst_element_message_full:<appsrc>[00m posting message: Internal data flow error.
0:00:06.268446147 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
0:00:06.273770933 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
0:00:06.274603418 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
0:00:06.275939105 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
0:00:06.277303268 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
Error: code=1 message=Internal data flow error.
0:00:06.291740181 [332m14803[00m 0x7f24dc043450 [32;01mINFO   [00m [00;01;31;47m    GST_ERROR_SYSTEM gstelement.c:1987:gst_element_message_full:<appsrc>[00m posted error message: Internal data flow error.
0:00:06.292844435 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
Got TAG event
Tag minimum-bitrate = -1
Tag bitrate = 0
Tag maximum-bitrate = 0
0:00:06.297233217 [332m14803[00m 0x7f24dc043400 [33;01mWARN   [00m [00m              ffmpeg gstffmpegdec.c:2299:gst_ffmpegdec_frame:<ffdec_mpeg40>[00m ffdec_mpeg4: decoding error (len: -1, have_data: 0)
0:00:06.297382004 [332m14803[00m 0x7f24dc043400 [32;01mINFO   [00m [00;01;31;41m            GST_PADS gstpad.c:3554:gst_pad_event_default_dispatch:<mpeg4vparse0:sink>[00m Sending event 0x7f24dc148c60 (eos) to all internally linked pads
4

1 回答 1

0

回答我自己的问题

我在网上读到的关于 gstreamer 的最佳建议是:在代码中实现之前在命令行上测试你的管道。因此,如果它在命令行上工作,它应该在代码中工作。

以下问题并用c代码回答我的问题。即它提出了解决错误“gst_pad_push() = not-linked” gStreamer-Sharp Dynamic pads not linking后暂停的方法

但是,我不知道如何在 Java 代码中执行此操作。因此,我使用以下教程对 gstreamer 中的动态管道更加熟悉:动态管道:http ://docs.gstreamer.com/display/GstSDK/Basic+tutorial+3%3A+Dynamic+pipelines

上述教程在解决此问题时需要注意两点:

  1. GSignals 是 GStreamer 中的一个关键点。它们允许您在发生有趣的事情时收到通知(通过回调)。信号由名称标识,每个 GObject 都有自己的信号。

  2. 解复用器从没有其他元素可以链接到的源焊盘开始,因此流水线必须在它们处终止。解决方案是构建从源到解复用器的管道,并将其设置为运行(播放)。当解复用器收到足够的信息以了解容器中流的数量和种类时,它将开始创建源垫。这是我们完成管道构建并将其连接到新添加的解复用器垫的正确时间。

因此,我的 java 代码如下所示:

            public void run() {             
            JFrame frame = new JFrame("FakeSrcTest");
            VideoComponent panel = new VideoComponent();
            panel.setPreferredSize(new Dimension(width, height));
            frame.add(panel, BorderLayout.CENTER);
            final Element videosink = panel.getElement();

            pipeline.addMany(appsrc,  decodebin2,  ffmpegcolorspace, videosink);
            Element.linkMany(appsrc,  decodebin2);
            //we need to finish linking the pipeline later...

            appsrc.set("emit-signals", true);

            appsrc.connect(new AppSrc.NEED_DATA() {  ...

此外,您需要在 decodebin2 中创建 pad 时添加一个侦听器,此时您需要完成管道的链接。

            /* listen for newly created pads */
            decodebin2.connect(new Element.PAD_ADDED() {
                public void padAdded(Element element, Pad pad) {
                   System.out.println("New Pad " + pad.getName() + " was created");
                   Element.linkMany(decodebin2, ffmpegcolorspace, videosink);
                }
            });

而已。

我希望它可以帮助别人。

于 2015-01-17T11:26:13.200 回答