使用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]}
答案 0 :(得分:0)
问题正在尝试为音频数据创建映射。 AudioData不正确。我可以通过使用以下方法编写videoData时批处理音频样本数据来解决此问题:
path=/;