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
5
A
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);
}
}
}
}
}
}
Verwandte Themen
- 1. Streaming-Video mit Xuggler
- 2. Synchronisieren von Audio und Video mit OpenCV und PyAudio
- 3. Xuggler Codierung und Muxing
- 4. Video-und Audio-Datei
- 5. Synchronisieren von dekodierten Audio- und Videodaten von Mediacodec
- 6. Problem mit Audio/Video
- 7. Gibt es eine bessere Möglichkeit, Audio mit Video zu synchronisieren (ohne es einfach in das Video selbst zu übertragen)?
- 8. Android, Java - Darstellung eines Video Bitmap-Frames mit einem Video zu umkehren (Xuggler)
- 9. Komponieren von Video und Audio mit AVMutableComposition
- 10. Transcodieren von Audio und Video
- 11. Audio und Video nicht mixen
- 12. wie Video und Audio gleichzeitig mit AVCaptureVideoDataOutput und AVCaptureAudioDataOutput schreiben?
- 13. Wie funktioniert Chatroulette anonyme Video und Audio?
- 14. Video-Wiedergabe in Java (JMF, Fobs4JMF, Xuggler, FMJ)
- 15. Synchronisieren von Frames mit Audio und channel.position Genauigkeit
- 16. AVCaptureSession Video mit Audio aufzeichnen
- 17. Synchronisieren von Audio über ein Netzwerk
- 18. Audio/Video Content-Hinweise
- 19. Android- wie mische Audio und Audio mit ffmpeg
- 20. Konvertieren von Audio und Video in NSData
- 21. MPMoviePlayerController Video und Audio sind nicht synchron
- 22. Pipe Video und Audio zu ffmpeg von OpenRTSP
- 23. ffmpeg Zusammenführen von Video und Audio + Ausblenden
- 24. ffmpeg Wave-Audio-und AVI-Video-Format
- 25. Gstreamer: kann Video und Audio in rtmpsink
- 26. HTML-Entities für Bild, Audio und Video
- 27. Wie Mediendatei in RTP-Paketen mit Xuggler zu kodieren
- 28. AVFoundation AVMutableComposition - Video mit Audio - friert Video ein
- 29. Wie Audio zu Video-Datei auf iPhone SDK hinzufügen
- 30. Steganographie mit Video und Audio-Stream in Java oder C++
@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' –
Sie können alles von bekommen Openimaj-Bibliothek einschließlich Xuggler 5.4. youtube link: www.youtube.com/watch?v=TNEQ0eNqLgA –
@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