Я пытаюсь объединить несколько видеофайлов (mp4) в один файл.Я попытался использовать анализатор mp4, но не смог получить требуемый результат для этого.(Собираюсь опубликовать вопрос позже на их github)
Я попробовал следующий код.
getVideoFile (int i) просто возвращает абсолютный путь к видео с номером i.(sample1.mp4, sample2.mp4 как этот).
После запуска этого кода я получаю mp4 с размером, эквивалентным добавлению размеров всех видео.Это означает, что все кадры добавляются в окончательный mp4.Звук отлично сочетается, и я могу его хорошо слышать.
Единственная проблема - видео.Я думаю, что кадры как-то неуместны из-за неправильной презентации.Кадры случайным образом отображаются на видео.
Любая помощь будет принята с благодарностью.
val muxer: MediaMuxer = MediaMuxer(getOutputPath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
var tracksAdded = 0
var muxerStarted = false
val indexMap = HashMap<Int, Int>()
for(i in 2 until 6){
val extractor = MediaExtractor()
extractor.setDataSource(getVideoFile(i))
val trackCount = extractor.trackCount
//assertEquals("wrong number of tracks", expectedTrackCount, trackCount)
// Set up MediaMuxer for the destination.
// Set up the tracks.
for (i in 0 until trackCount) {
val format = extractor.getTrackFormat(i) {
extractor.selectTrack(i)
if (tracksAdded != 2) {
val dstIndex = muxer.addTrack(format)
indexMap[i] = dstIndex
tracksAdded++
}
}
if(!muxerStarted) {
muxer.start()
muxerStarted = true
}
// Copy the samples from MediaExtractor to MediaMuxer.
var sawEOS = false
val bufferSize = MAX_SAMPLE_SIZE
var frameCount = 0
val offset = 100
val dstBuf = ByteBuffer.allocate(bufferSize)
val bufferInfo = BufferInfo()
while (!sawEOS) {
bufferInfo.offset = offset
bufferInfo.size = extractor.readSampleData(dstBuf, offset)
if (bufferInfo.flags and MediaCodec.BUFFER_FLAG_CODEC_CONFIG !== 0){
bufferInfo.size = 0
}
if (bufferInfo.size < 0) {
Timber.d("newCombine saw eos")
sawEOS = true
bufferInfo.size = 0
} else {
bufferInfo.flags = extractor.sampleFlags
val trackIndex = extractor.sampleTrackIndex
if(extractor.sampleTime< prevOutputPTSUs) {
bufferInfo.presentationTimeUs = prevOutputPTSUs + 300
}else{
bufferInfo.presentationTimeUs = extractor.sampleTime
}
muxer.writeSampleData(indexMap[trackIndex] ?: 0, dstBuf,
bufferInfo)
prevOutputPTSUs = bufferInfo.presentationTimeUs
extractor.advance()
frameCount++
Log.d("newCombine", "Frame (" + frameCount + ") " +
"PresentationTimeUs:" + bufferInfo.presentationTimeUs +
" Flags:" + bufferInfo.flags +
" TrackIndex:" + trackIndex +
" Size(KB) " + bufferInfo.size / 1024)
}
}
}
muxer.stop()
muxer.release()
Я знаю, что подход, который я использую для презентации, может быть совершенно неверным, но звук правильно объединяется, но не видео.