android mp3文件解析,Android音视频开发-入门(四):使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件...

好时光

春分已过,下个时节就是清明了,送上古人小诗一首:

咏柳

碧玉妆成一树高,万条垂下绿丝绦。

不知细叶谁裁出,二月春风似剪刀。

MediaExtractor 抽取视频不含音频

/**

* 抽取(ly.mp4)的视频文件不含音频

*/

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

private void extracMedia() {

MediaExtractor mMediaExtractor = new MediaExtractor();

try {

mMediaExtractor.setDataSource(MEDIA_VIDEO_PATH);

//获取通道的个数

int trackCount = mMediaExtractor.getTrackCount();

int videoIndex = -1;

for (int i = 0; i < trackCount; i++) {

//这个trackFormat可不得了可以获取视频的宽高,视频的通道(音频视频),获取视频的长。有的人用这个获取帧率我试过,有的手机行有的

//不行,会报错。这是个坑,所以还是另求方式

MediaFormat trackFormat = mMediaExtractor.getTrackFormat(i);

String typeMimb = trackFormat.getString(MediaFormat.KEY_MIME);

if (typeMimb.startsWith("video/")) {

//这就获取了音频的信号通道了

videoIndex = i;

break;

}

}

//设置音频通道信号

mMediaExtractor.selectTrack(videoIndex);

//再次拿到这个视频通道的format

MediaFormat trackFormat = mMediaExtractor.getTrackFormat(videoIndex);

//初始化视频合成器

MediaMuxer mediaMuxer = new MediaMuxer(BASE_PATH + "/out_ly.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

//添加给合成器的通道

mediaMuxer.addTrack(trackFormat);

ByteBuffer allocate = ByteBuffer.allocate(500 * 1024);

mediaMuxer.start();

//获取视频的帧率

long videoSametime = 0;

mMediaExtractor.readSampleData(allocate, 0);

//跳过I帧,要P帧(视频是由个别I帧和很多P帧组成)

if (mMediaExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {

mMediaExtractor.advance();

}

mMediaExtractor.readSampleData(allocate, 0);

long firstTime = mMediaExtractor.getSampleTime();

//下一帧

mMediaExtractor.advance();

mMediaExtractor.readSampleData(allocate, 0);

long senondTime = mMediaExtractor.getSampleTime();

videoSametime = Math.abs(senondTime - firstTime);

//重新设置通道读取文件

mMediaExtractor.unselectTrack(videoIndex);

mMediaExtractor.selectTrack(videoIndex);

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

while (true) {

int readSamSize = mMediaExtractor.readSampleData(allocate, 0);

if (readSamSize < 0) {

break;

}

mMediaExtractor.advance();

bufferInfo.flags = mMediaExtractor.getSampleFlags();

bufferInfo.size = readSamSize;

bufferInfo.offset = 0;

bufferInfo.presentationTimeUs += videoSametime;

mediaMuxer.writeSampleData(videoIndex, allocate, bufferInfo);

}

mediaMuxer.stop();

mediaMuxer.release();

mMediaExtractor.release();

Log.e("av", "success!");

} catch (IOException e) {

e.printStackTrace();

}

}

MediaExtractor 抽取音频不含视频

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

private void extracAudio() {

MediaExtractor mediaExtractor = new MediaExtractor();

try {

mediaExtractor.setDataSource(AUDIO_VIDEO_PATH);

int trackCount = mediaExtractor.getTrackCount();

int audioIndex = -1;

for (int i = 0; i < trackCount; i++) {

MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);

String type = trackFormat.getString(MediaFormat.KEY_MIME);

if (type.startsWith("audio/")) {

audioIndex = i;

}

}

mediaExtractor.selectTrack(audioIndex);

MediaFormat trackFormat = mediaExtractor.getTrackFormat(audioIndex);

MediaMuxer mediaMuxer = new MediaMuxer(BASE_PATH + "/out_eat", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

int writeAudio = mediaMuxer.addTrack(trackFormat);

mediaMuxer.start();

ByteBuffer buffer = ByteBuffer.allocate(1024 * 500);

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

long sampleTime = 0;

mediaExtractor.readSampleData(buffer, 0);

if (mediaExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {

mediaExtractor.advance();

}

mediaExtractor.readSampleData(buffer, 0);

long firstTime = mediaExtractor.getSampleTime();

mediaExtractor.advance();

// mediaExtractor.readSampleData(buffer, 0);

long secondeTime = mediaExtractor.getSampleTime();

sampleTime = Math.abs(secondeTime - firstTime);

mediaExtractor.unselectTrack(audioIndex);

mediaExtractor.selectTrack(audioIndex);

while (true) {

int readSize = mediaExtractor.readSampleData(buffer, 0);

if (readSize < 0) {

break;

}

// mediaExtractor.readSampleData(buffer, 0);

mediaExtractor.advance();

bufferInfo.size = readSize;

bufferInfo.flags = mediaExtractor.getSampleFlags();

bufferInfo.offset = 0;

bufferInfo.presentationTimeUs = +sampleTime;

mediaMuxer.writeSampleData(writeAudio, buffer, bufferInfo);

}

mediaMuxer.stop();

mediaMuxer.release();

mediaExtractor.release();

Log.e("av", "success");

} catch (IOException e) {

e.printStackTrace();

}

}

MediaExtractor 抽取视频音频文件,然后利用MediaMuxer合成

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

private void combineVideo() {

//用生成的out_ly.map4 和音频out_eat 合成一个新的eat_ly.mp4

try {

MediaExtractor videoExtractor = new MediaExtractor();

videoExtractor.setDataSource(BASE_PATH + "/out_ly.mp4");

MediaFormat videoFormat = null;

int videoTrackIndex = -1;

int videoTrackCount = videoExtractor.getTrackCount();

for (int i = 0; i < videoTrackCount; i++) {

videoFormat = videoExtractor.getTrackFormat(i);

String mimeType = videoFormat.getString(MediaFormat.KEY_MIME);

if (mimeType.startsWith("video/")) {

videoTrackIndex = i;

break;

}

}

MediaExtractor audioExtractor = new MediaExtractor();

audioExtractor.setDataSource(BASE_PATH + "/out_eat");

MediaFormat audioFormat = null;

int audioTrackIndex = -1;

int audioTrackCount = audioExtractor.getTrackCount();

for (int i = 0; i < audioTrackCount; i++) {

audioFormat = audioExtractor.getTrackFormat(i);

String mimeType = audioFormat.getString(MediaFormat.KEY_MIME);

if (mimeType.startsWith("audio/")) {

audioTrackIndex = i;

break;

}

}

videoExtractor.selectTrack(videoTrackIndex);

audioExtractor.selectTrack(audioTrackIndex);

MediaCodec.BufferInfo videoBufferInfo = new MediaCodec.BufferInfo();

MediaCodec.BufferInfo audioBufferInfo = new MediaCodec.BufferInfo();

MediaMuxer mediaMuxer = new MediaMuxer(BASE_PATH + "/eat_ly.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

int writeVideoTrackIndex = mediaMuxer.addTrack(videoFormat);

int writeAudioTrackIndex = mediaMuxer.addTrack(audioFormat);

mediaMuxer.start();

ByteBuffer byteBuffer = ByteBuffer.allocate(500 * 1024);

long sampleTime = 0;

{

videoExtractor.readSampleData(byteBuffer, 0);

if (videoExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {

videoExtractor.advance();

}

videoExtractor.readSampleData(byteBuffer, 0);

long secondTime = videoExtractor.getSampleTime();

videoExtractor.advance();

long thirdTime = videoExtractor.getSampleTime();

sampleTime = Math.abs(thirdTime - secondTime);

}

videoExtractor.unselectTrack(videoTrackIndex);

videoExtractor.selectTrack(videoTrackIndex);

long stampTimeAudio = 0;

ByteBuffer byteBufferAudio = ByteBuffer.allocate(500 * 1024);

//获取帧之间的间隔时间

{

audioExtractor.readSampleData(byteBufferAudio, 0);

if (audioExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {

audioExtractor.advance();

}

audioExtractor.readSampleData(byteBufferAudio, 0);

long secondTime = audioExtractor.getSampleTime();

audioExtractor.advance();

long thirdTime = audioExtractor.getSampleTime();

stampTimeAudio = Math.abs(thirdTime - secondTime);

Log.e("fuck", stampTimeAudio + "");

}

audioExtractor.unselectTrack(audioTrackIndex);

audioExtractor.selectTrack(audioTrackIndex);

while (true) {

int readVideoSampleSize = videoExtractor.readSampleData(byteBuffer, 0);

if (readVideoSampleSize < 0) {

break;

}

videoBufferInfo.size = readVideoSampleSize;

videoBufferInfo.presentationTimeUs += sampleTime;

videoBufferInfo.offset = 0;

videoBufferInfo.flags = videoExtractor.getSampleFlags();

mediaMuxer.writeSampleData(writeVideoTrackIndex, byteBuffer, videoBufferInfo);

videoExtractor.advance();

}

while (true) {

int readAudioSampleSize = audioExtractor.readSampleData(byteBufferAudio, 0);

if (readAudioSampleSize < 0) {

break;

}

audioBufferInfo.size = readAudioSampleSize;

audioBufferInfo.presentationTimeUs += stampTimeAudio;

audioBufferInfo.offset = 0;

audioBufferInfo.flags = audioExtractor.getSampleFlags();

mediaMuxer.writeSampleData(writeAudioTrackIndex, byteBufferAudio, audioBufferInfo);

audioExtractor.advance();

}

mediaMuxer.stop();

mediaMuxer.release();

videoExtractor.release();

audioExtractor.release();

} catch (IOException e) {

e.printStackTrace();

}

}

以上代码全部测试通过,欢迎交流!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值