2012-07-25 3 views
5

Ich entwickle Screen Recorder with Audio mit xuggler in Java. Ich habe erfolgreich Videodatei und Audiodatei separat erstellt. jetzt möchte ich diese beiden Dateien synchronisieren. Ich habe versucht, "ConcatenateAudioAndVideo.java" zu verwenden, aber wenn ich die Datei dann es nur 44bytes Datei produzieren. Kann mir jemand sagen, was das Problem ist? Vielen Dank im Voraus.wie Audio und Video mit Xuggler zu synchronisieren

Antwort

13

Ich hebte auch das Problem der Synchronisierung von zwei Dateien (Audio und Video). Es gab viele Tipps, dies im Internet zu tun, aber kein vollständiges Codebeispiel. Ich habe es gelöst, indem ich den Code mit xuggler geschrieben habe. Hier ist der Code. Wenn Sie irgendwelche Fragen haben, fragen Sie bitte. Ich werde dir helfen, so viel ich kann. Das ist der Code:

import com.xuggle.mediatool.IMediaWriter; 
import com.xuggle.mediatool.ToolFactory; 
import com.xuggle.xuggler.IAudioSamples; 
import com.xuggle.xuggler.ICodec; 
import com.xuggle.xuggler.IContainer; 
import com.xuggle.xuggler.IPacket; 
import com.xuggle.xuggler.IStream; 
import com.xuggle.xuggler.IStreamCoder; 
import com.xuggle.xuggler.IVideoPicture; 


/** 
* This class is used to merge audio and video file. 
* 
* @author Arslaan Ejaz 
*/ 
public class DecodeAndSaveAudioVideo { 

public static void main(String[] args) 
    { 

    String filenamevideo = "f:/testvidfol/video.mp4"; //this is the input file for video. you can change extension 
    String filenameaudio = "f:/testvidfol/audio.wav"; //this is the input file for audio. you can change extension 


    IMediaWriter mWriter = ToolFactory.makeWriter("f:/testvidfol/audiovideooutput.flv"); //output file 

    IContainer containerVideo = IContainer.make(); 
    IContainer containerAudio = IContainer.make(); 

    if (containerVideo.open(filenamevideo, IContainer.Type.READ, null) < 0) 
     throw new IllegalArgumentException("Cant find " + filenamevideo); 

    if (containerAudio.open(filenameaudio, IContainer.Type.READ, null) < 0) 
     throw new IllegalArgumentException("Cant find " + filenameaudio); 

    int numStreamVideo = containerVideo.getNumStreams(); 
    int numStreamAudio = containerAudio.getNumStreams(); 

    System.out.println("Number of video streams: "+numStreamVideo + "\n" + "Number of audio streams: "+numStreamAudio); 

int videostreamt = -1; //this is the video stream id 
int audiostreamt = -1; 

IStreamCoder videocoder = null; 

    for(int i=0; i<numStreamVideo; i++){ 
     IStream stream = containerVideo.getStream(i); 
     IStreamCoder code = stream.getStreamCoder(); 

     if(code.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) 
     { 
      videostreamt = i; 
      videocoder = code; 
      break; 
     } 

    } 

    for(int i=0; i<numStreamAudio; i++){ 
     IStream stream = containerAudio.getStream(i); 
     IStreamCoder code = stream.getStreamCoder(); 

     if(code.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) 
     { 
      audiostreamt = i; 
      break; 
     } 

    } 

    if (videostreamt == -1) throw new RuntimeException("No video steam found"); 
    if (audiostreamt == -1) throw new RuntimeException("No audio steam found"); 

    if(videocoder.open()<0) throw new RuntimeException("Cant open video coder"); 
    IPacket packetvideo = IPacket.make(); 

    IStreamCoder audioCoder = containerAudio.getStream(audiostreamt).getStreamCoder(); 

    if(audioCoder.open()<0) throw new RuntimeException("Cant open audio coder"); 
    mWriter.addAudioStream(1, 1, audioCoder.getChannels(), audioCoder.getSampleRate()); 

    mWriter.addVideoStream(0, 0, videocoder.getWidth(), videocoder.getHeight()); 

    IPacket packetaudio = IPacket.make(); 

    while(containerVideo.readNextPacket(packetvideo) >= 0 || 
      containerAudio.readNextPacket(packetaudio) >= 0){ 

     if(packetvideo.getStreamIndex() == videostreamt){ 

      //video packet 
      IVideoPicture picture = IVideoPicture.make(videocoder.getPixelType(), 
        videocoder.getWidth(), 
        videocoder.getHeight()); 
      int offset = 0; 
      while (offset < packetvideo.getSize()){ 
       int bytesDecoded = videocoder.decodeVideo(picture, 
         packetvideo, 
         offset); 
       if(bytesDecoded < 0) throw new RuntimeException("bytesDecoded not working"); 
       offset += bytesDecoded; 

       if(picture.isComplete()){ 
        System.out.println(picture.getPixelType()); 
        mWriter.encodeVideo(0, picture); 

       } 
      } 
     } 

     if(packetaudio.getStreamIndex() == audiostreamt){ 
     //audio packet 

      IAudioSamples samples = IAudioSamples.make(512, 
        audioCoder.getChannels(), 
        IAudioSamples.Format.FMT_S32); 
      int offset = 0; 
      while(offset<packetaudio.getSize()) 
      { 
       int bytesDecodedaudio = audioCoder.decodeAudio(samples, 
         packetaudio, 
         offset); 
       if (bytesDecodedaudio < 0) 
        throw new RuntimeException("could not detect audio"); 
       offset += bytesDecodedaudio; 

       if (samples.isComplete()){ 
        mWriter.encodeAudio(1, samples); 

     } 
      } 

    } 

    } 
} 
} 
+0

@arslaan ejaz ich versuchte ur code, aber will nur wissen, welche Bibliotheken und speziell ihre Versionen Sie hier verwendet haben. Ich erhalte den folgenden Fehler: 'Ausnahme im Thread" main "java.lang.NoSuchMethodError: org.slf4j.Logger.trace (Ljava/lang/String; Ljava/lang/Object;) V' –

+0

Sie können alles von bekommen Openimaj-Bibliothek einschließlich Xuggler 5.4. youtube link: www.youtube.com/watch?v=TNEQ0eNqLgA –

+0

@arslaan ejaz: Kannst du mir bitte helfen, das Video mit Audiodatei zu suchen? Ich habe erfolgreich die Audiovideodatei erstellt, aber Probleme mit der Suche in MAC OS ... Bitte helfen Sie, wenn Sie wissen – tarkikshah

Verwandte Themen