2012-01-13 6 views
2

私はmp3ファイルと画像を持っています。私はそれらを組み合わせたビデオをJavaで作成する必要があります。
私はxuggleでそれをやろうとしていますが、結果はまだありません。
誰でも私に何か提案を与えることができますか?Xuggleはオーディオと生成されたオーディオを結合します

+0

どうやってやっていますか? MediaToolを使うべきでしょうか? (参照:[MediaToolはじめに](http://wiki.xuggle.com/MediaTool_Introduction)) – mrzasa

+0

私はまだXuggleを初めて使っています。私は2つのストリームを作成しようとしました.1つはオーディオ用、もう1つはビデオ用です(サイトのいくつかの例のようなものですが)、おそらく私は何か間違ったことをしています... – user584397

+0

私の問題は、フライ、しかし、オーディオはすでにディスク上にある、私はそれらを一緒に置く方法を知らない。私はビデオだけを保存して、それらを連結することを考えました([link] http://code.google.com/p/xuggle/source/browse/trunk/java/xuggle-xuggler/src/com/xuggle/mediatool/デモ/ ConcatenateAudioAndVideo.java [/リンク])しかし、このサンプルではうまくいかなかった... – user584397

答えて

2

最後に解決策が見つかりました。

私はXuggleの例のコードを使用しました。

また、オーディオトランスコードの問題も解決しました。

私はここに自分のコードを書いています。理由は説明できませんが、うまくいきます。

public String make() throws IOException, InterruptedException { 
     BufferedImage s1 = genImage(); 
     writer = ToolFactory.makeWriter("temp/" + sermon.getFile().getName() + ".flv"); 

     String filename = sermon.getFile().getAbsolutePath(); 
     IContainer container = IContainer.make(); 

     if (container.open(filename, IContainer.Type.READ, null) < 0) { 
      throw new IllegalArgumentException("could not open file: " + filename); 
     } 
     int numStreams = container.getNumStreams(); 

     int audioStreamId = -1; 
     IStreamCoder audioCoder = null; 
     for (int i = 0; i < numStreams; i++) { 
      IStream stream = container.getStream(i); 
      IStreamCoder coder = stream.getStreamCoder(); 
      if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) { 
       audioStreamId = i; 
       audioCoder = coder; 
       break; 
      } 
     } 
     if (audioStreamId == -1) { 
      throw new RuntimeException("could not find audio stream in container: " + filename); 
     } 

     if (audioCoder.open() < 0) { 
      throw new RuntimeException("could not open audio decoder for container: " + filename); 
     } 
     writer.addAudioStream(0, 0, audioCoder.getChannels(), audioCoder.getSampleRate()); 
     writer.addVideoStream(1, 1, width, height); 
     IPacket packet = IPacket.make(); 
     int n = 0; 
     while (container.readNextPacket(packet) >= 0) { 
      n++; 

      if (packet.getStreamIndex() == audioStreamId) { 
       IAudioSamples samples = IAudioSamples.make(2048, audioCoder.getChannels()); 
       int offset = 0; 
       while (offset < packet.getSize()) { 
        try { 
         int bytesDecoded = audioCoder.decodeAudio(samples, packet, offset); 
         if (bytesDecoded < 0) { 
          //throw new RuntimeException("got error decoding audio in: " + filename); 
          break; 
         } 
         offset += bytesDecoded; 

         if (samples.isComplete()) { 
          if (n % 1000 == 0) { 
           writer.flush(); 
           System.out.println(n); 
           System.gc(); 
          } 
          writer.encodeAudio(0, samples); 
         } 
        } catch (Exception e) { 
         System.out.println(e); 
        } 
       } 
      } else { 
       do { 
       } while (false); 
      } 
     } 
     for (int i = 0; i < container.getDuration()/1000000; i++) { 
      writer.encodeVideo(1, s1, i, TimeUnit.SECONDS); 
     } 

     writer.close(); 

     if (audioCoder != null) { 
      audioCoder.close(); 
      audioCoder = null; 
     } 
     if (container != null) { 
      container.close(); 
      container = null; 
     } 
     return "temp/" + sermon.getFile().getName() + ".flv"; 
    } 

ありがとう、幸運。

関連する問題