Невозможно объединить 2 файла mp4 с помощью Media Extractor и Media Muxer - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь объединить несколько видеофайлов (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()

Я знаю, что подход, который я использую для презентации, может быть совершенно неверным, но звук правильно объединяется, но не видео.

...