Sto sviluppando Screen Recorder with Audio
usando xuggler
in java. Ho creato con successo file video e file audio separatamente. ora voglio sincronizzare questi due file. Ho provato a utilizzare "ConcatenateAudioAndVideo.java", ma quando eseguo il file, si produce solo il file 44bytes
. Qualcuno può dirmi qual è il problema? Grazie in anticipo.come sincronizzare audio e video usando xuggler
5
A
risposta
13
Avevo anche il problema di sincronizzare due file (audio e video). C'erano molti consigli per farlo su Internet ma non un esempio di codice completo. L'ho risolto scrivendo il codice usando xuggler. Ecco il codice. Se avete qualche domanda per favore chiedete. Ti aiuterò, il più possibile. Questo è il codice:
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);
}
}
}
}
}
}
Problemi correlati
- 1. Live Streaming (Socket) - Come sincronizzare audio e video?
- 2. come scrivere video e audio contemporaneamente usando AVCaptureVideoDataOutput e AVCaptureAudioDataOutput?
- 3. Come installare Xuggler?
- 4. Streaming audio e video con Python
- 5. Sincronizza i dati audio e video decodificati da Mediacodec
- 6. AVFoundation: lavorazione da video a trama OpenGL - Come riprodurre e sincronizzare l'audio?
- 7. Composizione di video e audio utilizzando AVMutableComposition
- 8. Unire immagini e audio al video risultante
- 9. iOS: tocca Audio e video da Airplay
- 10. Conversione di audio e video in NSData
- 11. Hadoop e diversi formati di input come Immagine, Audio, Video
- 12. video Android, ascolto audio ma nessun video
- 13. Come sincronizzare un audio su 2 o più dispositivi ios
- 14. Qualcuno ha un esempio di come scrivere audio e video contemporaneamente usando AVAssetWriter?
- 15. Registrare video e audio e caricare sul server
- 16. AVCaptureSession Registra video con audio
- 17. Come unire file audio e video in Android
- 18. android - Come mux file audio e file video?
- 19. Come arrestare IDM dall'acquisizione di video/audio
- 20. Android come identificare audio/video da xml?
- 21. Quali codec supporta Xuggler?
- 22. Riproduci audio e video con una pipeline in Gstreamer (Python)
- 23. Registrazione audio e video utilizzando AVFoundation fotogramma per fotogramma
- 24. Codifica video usando AVAssetWriter - CRASHES
- 25. HTML5: acquisizione audio e video combinati dal browser
- 26. Combinazione di un flusso audio e video utilizzando gstreamer
- 27. Come rimuovere una traccia dal file video usando ffmpeg?
- 28. Aggiungi audio al video in Android
- 29. Decrittografia audio/video al volo su MediaPlayer
- 30. GData youtube video upload mancante audio issue
@arslaan ejaz ho provato il codice ur, ma voglio solo sapere quali sono le librerie e specialmente le loro versioni che hai usato qui. Ricevo il seguente errore: 'Eccezione nel thread" main "java.lang.NoSuchMethodError: org.slf4j.Logger.trace (Ljava/lang/String; Ljava/lang/Object;) V' –
Puoi ottenere tutto da libreria openimaj incluso xuggler 5.4. collegamento youtube: www.youtube.com/watch?v=TNEQ0eNqLgA –
@arslaan ejaz: Puoi aiutarmi a cercare il video con file audio? Ho creato con successo il file audio video, ma ho problemi con il seek in MAC os ... Si prega di aiuto se si conosce – tarkikshah