2013-02-21 46 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

相关问题