首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >音频的MediaExtractor,获取意外的音频

音频的MediaExtractor,获取意外的音频
EN

Stack Overflow用户
提问于 2018-02-03 13:22:38
回答 1查看 961关注 0票数 0

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

代码语言:javascript
复制
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将此视频与前面提到的音频提取进行多路复用。在处理视频时,使用哈希图将音频交织到多路复用器中。

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

代码语言:javascript
复制
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应该已经是编码的音频数据,所以数据应该能够直接通过管道传输。

代码语言:javascript
复制
if( (audioExtractor.getSampleFlags() & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) 
   Log.d(TAG, "BUFFER_FLAG_END_OF_STREAM")

我现在正在质疑最初的mp4视频,是否有可能有一个mp4的不可提取的音频轨道,以及我如何可能证实这一点。

如果我当前的实现中有任何错误,任何见解都会有所帮助!

{最大比特率=512000,采样率=48000,音轨id=2,durationUs=22373187,mime=音频/MP4A-latm,profile=2,通道计数=4,language=`,aac-=2,bitrate=512000,最大输入大小=1764,csd-0=java.nio.HeapByteBufferpos=0 lim=2 cap=2}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-03 08:22:47

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

代码语言:javascript
复制
    private void writeAudioSampleData(
                MediaExtractor audioExtractor, MediaMuxer muxer, int filterStart, int filterEnd) {
        mFilterStart = filterEnd;
        MediaCodec.BufferInfo audioBufferInfo = new MediaCodec.BufferInfo();
        boolean audioExtractorDone = false;
        audioExtractor.seekTo(filterStart, MediaExtractor.SEEK_TO_CLOSEST_SYNC);

        synchronized (mAudioLockObject) {
            while (!audioExtractorDone) {
                try {
                    audioBufferInfo.size =
                            audioExtractor.readSampleData(audioInputBuffer, 0);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (DEBUG) {
                    Log.d(TAG, "audioBufferInfo.size: " + audioBufferInfo.size);
                }

                if (audioBufferInfo.size < 0) {
                    audioBufferInfo.size = 0;
                    audioExtractorDone = true;
                } else {
                    audioBufferInfo.presentationTimeUs = audioExtractor.getSampleTime();
                    if (audioBufferInfo.presentationTimeUs > filterEnd) {
                        break;      //out of while
                    }
                    if (audioBufferInfo.presentationTimeUs >= filterStart &&
                            audioBufferInfo.presentationTimeUs <= filterEnd) {
                        audioBufferInfo.presentationTimeUs -= mOriginalMediaItem.mRecordingStartTs;
                        audioBufferInfo.flags = audioExtractor.getSampleFlags();
                        try {
                            muxer.writeSampleData(mAudioTrackIndex, audioInputBuffer,
                                    audioBufferInfo);
                            if (DEBUG)Log.d(TAG, String.format("Wrote %d audio bytes at %d",
                                    audioBufferInfo.size, audioBufferInfo.presentationTimeUs));
                        } catch(IllegalArgumentException | IllegalStateException |
                                NullPointerException ignore) {}
                    }

                    audioExtractor.advance();
                }
            }
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48594218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档