MediaExtractor用于音频,获得意想不到的音频

时间:2018-02-03 05:22:38

标签: android ffmpeg exoplayer mediaextractor android-mediacodec

使用MediaExtractor类,我可以从保存的mp4视频中获取编码的音频样本数据,如下所示:

ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 256);
MediaExtractor audioExtractor = new MediaExtractor();
try {
    int trackIndex = -1;
    audioExtractor.setDataSource(originalMediaItem.getFilePath());

    for (int i = 0; i < audioExtractor.getTrackCount(); i++) {
        MediaFormat format = audioExtractor.getTrackFormat(i);
        String mime = format.getString(MediaFormat.KEY_MIME);

        if (mime.startsWith("audio/")) {
            trackIndex = i;
            break;
        }
    }

    audioExtractor.selectTrack(trackIndex);

    mAudioFormatMedia = audioExtractor.getTrackFormat(trackIndex);
    mAudioTrackIndex = mMediaMuxer.addTrack(mAudioFormatMedia);

    int size = audioExtractor.readSampleData(byteBuffer, 0);
    do {
        if (audioExtractor.getSampleTrackIndex() == 1) {
            long presentationTime = audioExtractor.getSampleTime();
            mInputBufferHashMap.put(presentationTime, byteBuffer);
            audioExtractor.advance();
            size = audioExtractor.readSampleData(byteBuffer, 0);
        }
    } while (size >= 0);
    audioExtractor.release();
    audioExtractor = null;
} catch (IOException e) {
    e.printStackTrace();
}

我有一个来自GlSurface的视频源,然后想要使用MediaMuxer将此视频与前面提到的音频提取混合。在处理视频时,使用散列图将音频交错到多路复用器中。我成功地将视频和音频复用并创建了可播放的mp4视频,但音频听起来并不像原来的mp4的原始音频。

当我写入多路复用器时,我确实看到了预期的bufferinfo.size和bufferInfo.presentationTimeUs:

mMediaMuxer.writeSampleData(mAudioTrackIndex, buffer, mAudioBufferInfo);
Log.d(TAG, String.format("Wrote %d audio bytes at %d", mAudioBufferInfo.size, mAudioBufferInfo.presentationTimeUs));

我尝试使用标准的inputBuffer,outputBuffer和MediaCodec,就像这个https://gist.github.com/a-m-s/1991ab18fbcb0fcc2cf9一样,但这会产生相同的音频,而根据我的理解,MediaExtractor应该已经是编码音频数据了,所以数据应该是能够直接用管道传输。

有趣的是,当我在最初提取时检查标志时:

if( (audioExtractor.getSampleFlags() & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) 
   Log.d(TAG, "BUFFER_FLAG_END_OF_STREAM")

上述任何一个都不会打印出原始mp4视频。我现在正在质疑最初的mp4视频以及是否有可能为mp4配备一个不可提取的录音带以及我怎么可能确认这一点。

我相信我已经查看了大多数关于stackoverflow的MediaExtractor问题以及github上的MediaExtractor的许多单例解决方案。有没有人知道以另一种方式提取音频的方法,即使用ExoPlayer(最好不要使用ffmpeg,因为它在android项目上增加了大量开销)。如果我当前的实施中有任何错误,任何见解都会有所帮助!

编辑1:格式为audioExtractor.getTrackFormat(trackIndex):

  

{max-bitrate = 512000,sample-rate = 48000,track-id = 2,durationUs = 22373187,mime = audio / mp4a-latm,profile = 2,channel-count = 4,language =```, aac-profile = 2,bitrate = 512000,max-input-size = 1764,csd-0 = java.nio.HeapByteBuffer [pos = 0 lim = 2 cap = 2]}

1 个答案:

答案 0 :(得分:0)

问题正在尝试为音频数据创建映射。 AudioData不正确。我可以通过使用以下方法编写videoData时批处理音频样本数据来解决此问题:

path=/;