2014-12-24 2 views
0
내가 gstreamer를-자바하려면 다음 파이프 라인을 얻기 위해 노력하고 있어요

이 (gstreamer를-0.10를 사용) :!ffdec_mpeg4 : 파이프 라인 decodebin2와 함께 gstreamer-java를 사용하는 동안 gst_pad_push() = 연결되지 않은 디코딩 오류! ffmpegcolorspace! 비디오/X-원시 RGB

'GST-출시 - 0.10 filesrc 위치 = big_buck_bunny_480p_surround-fix.avi decodebin2 ! ffmpegcolorspace! autovideosink "

이 파이프 라인은 명령 줄에서 작동합니다. 기계 vbox vm 우분투 실행 14.04 LTS

누구든지 내 문제가 Java 코드의 파이프 라인과 어떤 관련이 있는지 파악할 수 있습니까? 다음과 같이

자바 코드는 다음과 같습니다

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 
:

공공 정적 무효 메인 (문자열 []에 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

내 질문에 답변하기

온라인으로 읽은 gstreame에 대한 최고의 조언 r : 코드로 구현하기 전에 명령 행에서 파이프 라인을 테스트하십시오. 따라서 명령 행에서 작동하는 경우 코드에서 작동해야합니다.

다음 질문과 대답은 내 질문에 C 코드. 즉 그것은 gStreamer-Sharp Dynamic pads not linking

는 그러나, 나는 자바 코드에서이를 수행하는 방법을 알고하지 않았다 "-연결되지() gst_pad_push 후 일시 정지 ="오류에 대한 해결책을 제안한다.

  1. GSignals가 중요한 포인트입니다 :이 문제를 해결하기 위의 튜토리얼에서주의하는 것이 http://docs.gstreamer.com/display/GstSDK/Basic+tutorial+3%3A+Dynamic+pipelines

    두 지점 : 동적 파이프 라인 : 그래서 다음 자습서를 사용하여 gstreamer를 동적 파이프 라인에 좀 더 잘 알고 있어요 GStreamer에서. 그들은 흥미로운 것이 일어 났을 때 (콜백을 통해) 통보를받을 수 있습니다. 신호는 이름으로 식별되며 각 GObject는 자체 신호를가집니다.

  2. demuxers는 다른 요소가 연결할 수있는 소스 패드가 없기 때문에 파이프 라인은 반드시 끝나야합니다. 해결책은 소스에서 demuxer까지 파이프 라인을 구축하고 실행 (재생)하도록 설정하는 것입니다. 디멀티플렉서가 컨테이너의 스트림 수와 종류에 대해 알 수있는 충분한 정보를 받으면 소스 패드 생성이 시작됩니다. 이것은 우리가 파이프 라인을 완성하고 새로 추가 된 디멀티플 패드에 연결하기에 적합한시기입니다. 다음과 같이

결과적으로 내 자바 코드는 같습니다

  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); 
       } 
      }); 

그게 전부입니다.

다른 사람들에게 도움이되기를 바랍니다.