【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据_android 去掉视频音频_little_fat_sheep的博客-CSDN博客
final int VIDEO=0, AUDIO=1;
extract(VIDEO);
extract(AUDIO);
void extract(int type) {
try {
String path = Environment.getExternalStorageDirectory().getPath();
String filename = "";
if (type == VIDEO)
filename = "no_sound_" + input_path.substring(input_path.lastIndexOf("/") + 1);
else if (type == AUDIO)
filename = "no_video_" + input_path.substring(input_path.lastIndexOf("/") + 1);
String output_path = path + File.separator + filename;
MediaExtractor mediaExtractor = new MediaExtractor();
mediaExtractor.setDataSource(input_path);
MediaMuxer mediaMuxer = new MediaMuxer(output_path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
int input_size = 0;
int videoTrackIndex = -1;
int count = mediaExtractor.getTrackCount(); //获取轨道数
for (int i = 0; i < count; i++) {
MediaFormat format = mediaExtractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
Log.e(Thread.currentThread().getStackTrace()[2] + "", "track" + i + ":" + mime);
if (type == VIDEO) {
if (mime.startsWith("video/")) { // mp4为"video/avc"
input_size = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
mediaExtractor.selectTrack(i);
videoTrackIndex = mediaMuxer.addTrack(format);
break;
}
} else if (type == AUDIO) {
if (mime.startsWith("audio/")) {
input_size = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
mediaExtractor.selectTrack(i);
videoTrackIndex = mediaMuxer.addTrack(format);
break;
}
}
}
mediaMuxer.start();
int sampleSize = 0;
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
ByteBuffer buffer = ByteBuffer.allocate(input_size); //也可以设置为:500*1024
while ((sampleSize = mediaExtractor.readSampleData(buffer, 0)) > 0) {
info.offset = 0;
info.size = sampleSize;
info.flags = mediaExtractor.getSampleFlags();
info.presentationTimeUs = mediaExtractor.getSampleTime();
mediaMuxer.writeSampleData(videoTrackIndex, buffer, info); //写入数据
mediaExtractor.advance(); //下一帧
}
mediaExtractor.release();
mediaMuxer.stop();
mediaMuxer.release();
MediaScannerConnection.scanFile(MainActivity.this, new String[]{ output_path }, null, null);
Toast.makeText(getApplicationContext(), "视频生成完成:" + output_path, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
//java.io.IOException: Failed to instantiate extractor.
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
}
}
选择视频文件
String input_path = "";
void chooseFile() {
int CHOOSE_VIDEO = 200;
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, CHOOSE_VIDEO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
String[] proj = { MediaStore.Video.Media.DATA };
Cursor cursor = managedQuery(uri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
cursor.moveToFirst();
input_path = cursor.getString(column_index);
Log.e(Thread.currentThread().getStackTrace()[2] + "", input_path);
}
}