parent
c63132ec8d
commit
a1276b776e
@ -0,0 +1,91 @@ |
||||
package com.frank.androidmedia.controller |
||||
|
||||
import android.media.MediaCodec |
||||
import android.media.MediaExtractor |
||||
import android.media.MediaFormat |
||||
import android.media.MediaMuxer |
||||
import android.util.Log |
||||
import java.lang.Exception |
||||
import java.nio.ByteBuffer |
||||
|
||||
/** |
||||
* Using MediaExtractor to demux media format. |
||||
* Using MediaMuxer to mux media format again. |
||||
* @author frank |
||||
* @date 2022/3/21 |
||||
*/ |
||||
open class MediaMuxController { |
||||
|
||||
fun muxMediaFile(inputPath: String, outputPath: String): Boolean { |
||||
if (inputPath.isEmpty() || outputPath.isEmpty()) { |
||||
return false |
||||
} |
||||
var happenError = false |
||||
val mediaMuxer = MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4) |
||||
val mediaExtractor = MediaExtractor() |
||||
try { |
||||
var videoIndex = 0 |
||||
var audioIndex = 0 |
||||
var audioFormat: MediaFormat? = null |
||||
var videoFormat: MediaFormat? = null |
||||
mediaExtractor.setDataSource(inputPath) |
||||
for (i in 0 until mediaExtractor.trackCount) { |
||||
val mediaFormat = mediaExtractor.getTrackFormat(i) |
||||
val mimeType = mediaFormat.getString(MediaFormat.KEY_MIME) |
||||
if (mimeType != null && mimeType.startsWith("video")) { |
||||
videoIndex = i |
||||
videoFormat = mediaFormat |
||||
mediaExtractor.selectTrack(i) |
||||
} else if (mimeType != null && mimeType.startsWith("audio") && audioFormat == null) { |
||||
audioIndex = i |
||||
audioFormat = mediaFormat |
||||
mediaExtractor.selectTrack(i) |
||||
} |
||||
} |
||||
if (videoFormat != null) { |
||||
mediaMuxer.addTrack(videoFormat) |
||||
} |
||||
if (audioFormat != null) { |
||||
mediaMuxer.addTrack(audioFormat) |
||||
} |
||||
|
||||
var finished = false |
||||
val bufferInfo = MediaCodec.BufferInfo() |
||||
val inputBuffer = ByteBuffer.allocate(2 * 1024 * 1024) |
||||
|
||||
mediaMuxer.start() |
||||
|
||||
while (!finished) { |
||||
val sampleSize = mediaExtractor.readSampleData(inputBuffer, 0) |
||||
Log.i("MediaMuxerController", "sampleIndex=" + mediaExtractor.sampleTrackIndex + ",sampleSize=" + sampleSize) |
||||
if (sampleSize > 0) { |
||||
bufferInfo.size = sampleSize |
||||
bufferInfo.flags = mediaExtractor.sampleFlags |
||||
bufferInfo.presentationTimeUs = mediaExtractor.sampleTime |
||||
if (mediaExtractor.sampleTrackIndex == videoIndex) { |
||||
mediaMuxer.writeSampleData(videoIndex, inputBuffer, bufferInfo) |
||||
} else if (mediaExtractor.sampleTrackIndex == audioIndex) { |
||||
mediaMuxer.writeSampleData(audioIndex, inputBuffer, bufferInfo) |
||||
} |
||||
inputBuffer.flip() |
||||
mediaExtractor.advance() |
||||
} else if (sampleSize < 0) { |
||||
finished = true |
||||
} |
||||
} |
||||
|
||||
} catch (e: Exception) { |
||||
Log.e("MediaMuxerController", "mux error=$e") |
||||
happenError = true |
||||
} finally { |
||||
try { |
||||
mediaMuxer.release() |
||||
mediaExtractor.release() |
||||
} catch (e1: Exception) { |
||||
Log.e("MediaMuxerController", "release error=$e1") |
||||
} |
||||
return !happenError |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue