android - Comment faire pour multiplexer le fichier audio et de la vidéo?
j'ai un 3gp fichier qui est enregistré par le microphone et d'un fichier vidéo mp4.
je veux multiplexer le fichier audio et de fichiers vidéo en un fichier mp4 et l'enregistrer.
j'ai beaucoup cherché mais n'ai pas trouvé quelque chose d'utile pour l'utilisation de MediaMuxer api d'android.
MediaMuxer api
Mise à JOUR : c'est ma méthode qui mux deux fichiers , j'ai une Exception dans ce.
et la raison en est que la destination mp4 fichier n'a pas toute la piste!
quelqu'un peut m'aider avec l'ajout de l'audio et de la vidéo à la piste de multiplexeur??
Exception
java.lang.IllegalStateException: Failed to stop the muxer
mon code:
private void cloneMediaUsingMuxer( String dstMediaPath) throws IOException {
//Set up MediaExtractor to read from the source.
MediaExtractor soundExtractor = new MediaExtractor();
soundExtractor.setDataSource(audioFilePath);
MediaExtractor videoExtractor = new MediaExtractor();
AssetFileDescriptor afd2 = getAssets().openFd("Produce.MP4");
videoExtractor.setDataSource(afd2.getFileDescriptor() , afd2.getStartOffset(),afd2.getLength());
//PATH
//extractor.setDataSource();
int trackCount = soundExtractor.getTrackCount();
int trackCount2 = soundExtractor.getTrackCount();
//assertEquals("wrong number of tracks", expectedTrackCount, trackCount);
//Set up MediaMuxer for the destination.
MediaMuxer muxer;
muxer = new MediaMuxer(dstMediaPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
//Set up the tracks.
HashMap<Integer, Integer> indexMap = new HashMap<Integer, Integer>(trackCount);
for (int i = 0; i < trackCount; i++) {
soundExtractor.selectTrack(i);
MediaFormat SoundFormat = soundExtractor.getTrackFormat(i);
int dstIndex = muxer.addTrack(SoundFormat);
indexMap.put(i, dstIndex);
}
HashMap<Integer, Integer> indexMap2 = new HashMap<Integer, Integer>(trackCount2);
for (int i = 0; i < trackCount2; i++) {
videoExtractor.selectTrack(i);
MediaFormat videoFormat = videoExtractor.getTrackFormat(i);
int dstIndex2 = muxer.addTrack(videoFormat);
indexMap.put(i, dstIndex2);
}
//Copy the samples from MediaExtractor to MediaMuxer.
boolean sawEOS = false;
int bufferSize = MAX_SAMPLE_SIZE;
int frameCount = 0;
int offset = 100;
ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
MediaCodec.BufferInfo bufferInfo2 = new MediaCodec.BufferInfo();
muxer.start();
while (!sawEOS) {
bufferInfo.offset = offset;
bufferInfo.size = soundExtractor.readSampleData(dstBuf, offset);
bufferInfo2.offset = offset;
bufferInfo2.size = videoExtractor.readSampleData(dstBuf, offset);
if (bufferInfo.size < 0) {
sawEOS = true;
bufferInfo.size = 0;
bufferInfo2.size = 0;
}else if(bufferInfo2.size < 0){
sawEOS = true;
bufferInfo.size = 0;
bufferInfo2.size = 0;
}
else {
bufferInfo.presentationTimeUs = soundExtractor.getSampleTime();
bufferInfo2.presentationTimeUs = videoExtractor.getSampleTime();
//bufferInfo.flags = extractor.getSampleFlags();
int trackIndex = soundExtractor.getSampleTrackIndex();
int trackIndex2 = videoExtractor.getSampleTrackIndex();
muxer.writeSampleData(indexMap.get(trackIndex), dstBuf,
bufferInfo);
soundExtractor.advance();
videoExtractor.advance();
frameCount++;
}
}
Toast.makeText(getApplicationContext(),"f:"+frameCount,Toast.LENGTH_SHORT).show();
muxer.stop();
muxer.release();
}
Mise à JOUR 2: problème résolu! de vérifier ma réponse à ma question.
merci pour votre aide
- Êtes-vous prêt à utiliser le NDK ou voulez-vous la solution pour être en pure java?
- Quelque chose pour résoudre le problème est parfait.java pur et mediaMuxer est mieux, je pense.
- Pouvez-vous fournir plus de les détails de l'exception? Il devrait y avoir un code d'exception à partir de MediaMuxer fournie dans le logcat dans vous regardez détaillé des paramètres de
Vous devez vous connecter pour publier un commentaire.
J'ai eu quelques problème avec des pistes audio et des fichiers vidéo.
ils ont disparu et tout est ok avec mon code , mais Maintenant vous pouvez l'utiliser pour la fusion d'un fichier audio et un fichier vidéo ensemble.
Code:
}
grâce à ces exemples de codes:MediaMuxer des exemples de Codes-vraiment parfait
IllegalStateException: Failed to add the track to the muxer
...Grâce mohamad ali gharat pour cette réponse, ça m'aide aussi beaucoup.
Mais il y a quelque modification que j'ai apportée au code de travail,
d'abord: - je changer
pour charger la vidéo à partir de
SDCard
.Deuxième: j'obtiens l'erreur avec
afin de le modifier pour
pour le faire fonctionner, que ce lien dire Android MediaMuxer a omis de s'arrêter
Ce dont vous aurez besoin pour travailler dans de ffmpeg. Voici un lien pour vous aider à:
FFmpeg sur Android
ffmpeg exige le NDK Android.
Une fois que vous avez que de travail, vous pouvez travailler sur le multiplexage audio et vidéo ensemble à l'aide de ffmpeg. Voici un lien vers une question qui, il le fait avec 2 fichiers vidéo (la réponse doit être similaire).
FFMPEG mux audio et vidéo (à partir d'une autre vidéo) - cartographie problème