Android音视频处理中MediaExtractor的使用
来源:互联网 发布:java dos 编辑:程序博客网 时间:2024/05/29 04:45
Android程序中提供了一个 MediaExtractor 类,可以用来分离容器中的视频track和音频track,下面的例子展示了使用MediaExtractor和MediaMuxer来实现视频的换音:
private void muxingAudioAndVideo() throws IOException {
MediaMuxer mMediaMuxer = new MediaMuxer(mOutputVideoPath,
MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
// 视频的MediaExtractor
MediaExtractor mVideoExtractor = new MediaExtractor();
mVideoExtractor.setDataSource(mVideoPath);
int videoTrackIndex = -1;
for (int i = 0; i < mVideoExtractor.getTrackCount(); i++) {
MediaFormat format = mVideoExtractor.getTrackFormat(i);
if (format.getString(MediaFormat.KEY_MIME).startsWith("video/")) {
mVideoExtractor.selectTrack(i);
videoTrackIndex = mMediaMuxer.addTrack(format);
break;
}
}
// 音频的MediaExtractor
MediaExtractor mAudioExtractor = new MediaExtractor();
mAudioExtractor.setDataSource(mAudioPath);
int audioTrackIndex = -1;
for (int i = 0; i < mAudioExtractor.getTrackCount(); i++) {
MediaFormat format = mAudioExtractor.getTrackFormat(i);
if (format.getString(MediaFormat.KEY_MIME).startsWith("audio/")) {
mAudioExtractor.selectTrack(i);
audioTrackIndex = mMediaMuxer.addTrack(format);
}
}
// 添加完所有轨道后start
mMediaMuxer.start();
// 封装视频track
if (-1 != videoTrackIndex) {
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
info.presentationTimeUs = 0;
ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);
while (true) {
int sampleSize = mVideoExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
break;
}
info.offset = 0;
info.size = sampleSize;
info.flags = MediaCodec.BUFFER_FLAG_SYNC_FRAME;
info.presentationTimeUs = mVideoExtractor.getSampleTime();
mMediaMuxer.writeSampleData(videoTrackIndex, buffer, info);
mVideoExtractor.advance();
}
}
// 封装音频track
if (-1 != audioTrackIndex) {
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
info.presentationTimeUs = 0;
ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);
while (true) {
int sampleSize = mAudioExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
break;
}
info.offset = 0;
info.size = sampleSize;
info.flags = MediaCodec.BUFFER_FLAG_SYNC_FRAME;
info.presentationTimeUs = mAudioExtractor.getSampleTime();
mMediaMuxer.writeSampleData(audioTrackIndex, buffer, info);
mAudioExtractor.advance();
}
}
// 释放MediaExtractor
mVideoExtractor.release();
mAudioExtractor.release();
// 释放MediaMuxer
mMediaMuxer.stop();
mMediaMuxer.release();
}
MediaExtractor的接口比较简单,首先通过setDataSource()设置数据源,数据源可以是本地文件地址,也可以是网络地址:
MediaExtractor mVideoExtractor = new MediaExtractor();
mVideoExtractor.setDataSource(mVideoPath);
然后可以通过getTrackFormat(int index)来获取各个track的MediaFormat,通过MediaFormat来获取track的详细信息,如:MimeType、分辨率、采样频率、帧率等等:
for (int i = 0; i < mVideoExtractor.getTrackCount(); i++) {
MediaFormat format = mVideoExtractor.getTrackFormat(i);
}
获取到track的详细信息后,通过selectTrack(int index)选择指定的通道:
if (format.getString(MediaFormat.KEY_MIME).startsWith("video/")) {
mVideoExtractor.selectTrack(i);
break;
}
指定通道之后就可以从MediaExtractor中读取数据了:
while (true) {
int sampleSize = mVideoExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
break;
}
// do something
mVideoExtractor.advance(); // 移动到下一帧
}
在读取结束之后,记得释放资源:
mVideoExtractor.release();
来源:简书
0 0
- Android音视频处理中MediaExtractor的使用
- 【多媒体编解码】Android 视频解析MediaExtractor
- Android 视频分离和合成(MediaMuxer和MediaExtractor)
- 使用MediaExtractor和MediaMuxer分类和合成视频
- Android中视频处理
- Android MediaExtractor 浅析
- Android MediaExtractor setDataSource
- Android MediaExtractor Construction & Destruction
- android中视频播放的处理
- MediaExtractor
- Android-使用ffmpeg视频处理
- Android媒体解码MediaCodec,MediaExtractor
- MediaMuxer和MediaExtractor类(音频和视频数据的混合和分离)
- 利用MediaExtractor和MediaMuxer实现视频剪切
- 利用MediaExtractor和MediaMuxer实现视频剪切
- 在Android中音频和视频的处理
- 在Android中音频和视频的处理
- c#.net程序中使用ffmpeg.exe来处理视频并生成上传视频的截
- 基于mac上搭建python开发环境
- Eclipse上安装springsource-tool-suite
- 五、struts2的常量
- Nginx源码分析之ngx_hash_t
- 量子遗传算法以及matlab实现
- Android音视频处理中MediaExtractor的使用
- String,StringBuffer、StringBuilder的那些事
- 加密和认证
- 安卓手机软键盘弹出后不响应onKeyDown、onBackPressed方法解决方案
- 华中农大HZAUOJ 1097 1099 BFS、数据类型小心
- Ansible主机清单文件及ansible.cfg常用配置
- 2016 NOIP第一题 买铅笔
- 谈谈java中的WeakReference
- 函数定义 匿名函数