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 コードは次のとおりです。

public static void main(String[] args) {

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 後に一時停止する」というエラーの解決策を提案します。

しかし、Java コードでこれを行う方法がわかりませんでした。そこで、次のチュートリアルを使用して、gstreamer の動的パイプラインにもう少し慣れました: 動的パイプライン: http://docs.gstreamer.com/display/GstSDK/Basic+tutorial+3%3A+Dynamic+pipelines

この問題を解決するには、上記のチュートリアルから 2 つの点に注意してください。

  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 にパッドが作成されたときのリスナーを追加する必要があります。

            /* 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 に答える