2013-02-21 35 views
1

我試圖用Xuggler將音頻(.mp3)中的電影(.mp4)轉換。我用porcessing在OS XXugller illegalArgumentException

IMediaReader reader = ToolFactory.makeReader("/Users/nouv/Desktop/video1.mp4"); 
IMediaWriter writer = ToolFactory.makeWriter("/Users/nouv/Desktop/audioOutput.mp3", reader); 
int sampleRate = 22050; 
int channels = 1; 
writer.addAudioStream(0, 0, ICodec.ID.CODEC_ID_MP3, channels, sampleRate); 

reader.addListener(writer); 
try { 
    while (reader.readPacket() == null) 
      ; 
} finally {} 

我有這樣的錯誤:拋出:IllegalArgumentException:流[0]不是視頻

Exception in thread "Animation Thread" java.lang.IllegalArgumentException: stream[0] is not video 
at com.xuggle.mediatool.MediaWriter.encodeVideo(MediaWriter.java:754) 
at com.xuggle.mediatool.MediaWriter.encodeVideo(MediaWriter.java:783) 
at com.xuggle.mediatool.MediaWriter.onVideoPicture(MediaWriter.java:1434) 
at com.xuggle.mediatool.AMediaToolMixin.onVideoPicture(AMediaToolMixin.java:166) 
at com.xuggle.mediatool.MediaReader.dispatchVideoPicture(MediaReader.java:610) 
at com.xuggle.mediatool.MediaReader.decodeVideo(MediaReader.java:519) 
at com.xuggle.mediatool.MediaReader.readPacket(MediaReader.java:475) 
at xuggle.setup(xuggle.java:135) 
at processing.core.PApplet.handleDraw(PApplet.java:2117) 
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:193) 
at processing.core.PApplet.run(PApplet.java:2020) 
at java.lang.Thread.run(Thread.java:680) 

我試圖與.MP4,.MOV和FLV的電影,我有同樣的錯誤。

+1

哪來的代碼的其餘部分?這不是一個最小的運行示例。另外,看看http://www.benfarahmand.com/2012/11/tutorial-using-xuggler-in-processing.html?_escaped_fragment_=,看起來你並沒有完成所有必要的調用。從該代碼開始,將其降至最低,然後將其構建爲按照自己的意願進行操作? – 2013-02-21 14:19:04

+0

謝謝,我建立它,我沒有錯誤。但是當我試圖轉換一個mp4我有這個錯誤:2:10:11.715 [動畫主題]錯誤org.ffmpeg - [png @ 000000000C027950]指定的pix_fmt不支持 12:10:11.719 [動畫主題] WARN com。 xuggle.xuggler - 錯誤:無法打開編解碼器(../../../../../../../csrc/com/xuggle/xuggler/StreamCoder.cpp:831) – warn974 2013-02-22 08:14:32

+0

best bet: https://groups.google.com/forum/?fromgroups#!forum/xuggler-users – 2013-02-22 23:12:10

回答

3

IContainer container = IContainer.make();

int result = container.open(inputFilename, IContainer.Type.READ, null); 
    // check if the operation was successful 
     if (result<0) 
      throw new RuntimeException("Failed to open media file"); 

     int numStreams = container.getNumStreams(); 

     int audioStreamId = -1; 

     IContainer writer = IContainer.make(); 
     writer.open(outputFilename, IContainer.Type.WRITE, IContainerFormat.make()); 



     for (int i=0; i<numStreams; i++) { 

      IStream stream = container.getStream(i); 
      IStreamCoder coder = stream.getStreamCoder(); 
      IStreamCoder audioCoder = IStreamCoder.make(IStreamCoder.Direction.ENCODING, coder); 

      if(coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO){ 
       coder.open(IMetaData.make(), IMetaData.make()); 
       audioStreamId = i; 

       ICodec inputCodec = ICodec.findDecodingCodec(ICodec.ID.CODEC_ID_MP3); 
       if (inputCodec == null) 
        throw new IllegalArgumentException("could not find input codec id"); 

       if (audioStreamId == -1) 
        throw new RuntimeException("could not find audio stream in container: "+inputFilename); 

       writer.addNewStream(audioCoder); 
       if(writer.writeHeader() == 0) 
       { 

        IPacket packet = IPacket.make(); 
        while(container.readNextPacket(packet) >= 0){ 

         if(packet.getStreamIndex() == audioStreamId) 
         { 
          if(coder.isOpen()){ 

           writer.writePacket(packet); 

          } else {throw new RuntimeException("Could not open Coder"); } 
         } 
        } 
       }else {throw new RuntimeException("Header not Written for writer container.");} 
      } 

      coder.close(); audioCoder.close(); 
     } 
     writer.writeTrailer(); 
     writer.close(); 

希望這可以幫助... :)

+0

感謝您的幫助。 但我有這個錯誤 15:07:52.399 [動畫主題]錯誤com.xuggle.xuggler - 錯誤:數據包被寫入不存在的流(../../../../ .. /../../csrc/com/xuggle/xuggler/Container.cpp:759) – warn974 2013-02-28 11:15:06

+0

給了我工作正常的代碼...它仍然在工作 – Sreelal 2013-03-09 16:30:07

+0

在這裏留下以供參考:關於「正在寫入的數據包流不存在「錯誤,我也遇到了這個錯誤。數據包和寫入器的流索引必須匹配。我遇到了這個問題,因爲我的數據包索引設置爲1(音頻流索引rip),並且寫入器只有一個數據流爲0,並試圖根據數據包索引寫入數據包。所以通過添加「packet.setStreamIndex(0);」之前的「writer.writePacket(包)」; ,索引現在應該匹配,它應該工作。 – 2015-01-13 01:16:50

相關問題