• Android提取视频或音频


    【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据_android 去掉视频音频_little_fat_sheep的博客-CSDN博客

    1. final int VIDEO=0, AUDIO=1;
    2. extract(VIDEO);
    3. extract(AUDIO);
    4. void extract(int type) {
    5. try {
    6. String path = Environment.getExternalStorageDirectory().getPath();
    7. String filename = "";
    8. if (type == VIDEO)
    9. filename = "no_sound_" + input_path.substring(input_path.lastIndexOf("/") + 1);
    10. else if (type == AUDIO)
    11. filename = "no_video_" + input_path.substring(input_path.lastIndexOf("/") + 1);
    12. String output_path = path + File.separator + filename;
    13. MediaExtractor mediaExtractor = new MediaExtractor();
    14. mediaExtractor.setDataSource(input_path);
    15. MediaMuxer mediaMuxer = new MediaMuxer(output_path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
    16. int input_size = 0;
    17. int videoTrackIndex = -1;
    18. int count = mediaExtractor.getTrackCount(); //获取轨道数
    19. for (int i = 0; i < count; i++) {
    20. MediaFormat format = mediaExtractor.getTrackFormat(i);
    21. String mime = format.getString(MediaFormat.KEY_MIME);
    22. Log.e(Thread.currentThread().getStackTrace()[2] + "", "track" + i + ":" + mime);
    23. if (type == VIDEO) {
    24. if (mime.startsWith("video/")) { // mp4为"video/avc"
    25. input_size = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
    26. mediaExtractor.selectTrack(i);
    27. videoTrackIndex = mediaMuxer.addTrack(format);
    28. break;
    29. }
    30. } else if (type == AUDIO) {
    31. if (mime.startsWith("audio/")) {
    32. input_size = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
    33. mediaExtractor.selectTrack(i);
    34. videoTrackIndex = mediaMuxer.addTrack(format);
    35. break;
    36. }
    37. }
    38. }
    39. mediaMuxer.start();
    40. int sampleSize = 0;
    41. MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
    42. ByteBuffer buffer = ByteBuffer.allocate(input_size); //也可以设置为:500*1024
    43. while ((sampleSize = mediaExtractor.readSampleData(buffer, 0)) > 0) {
    44. info.offset = 0;
    45. info.size = sampleSize;
    46. info.flags = mediaExtractor.getSampleFlags();
    47. info.presentationTimeUs = mediaExtractor.getSampleTime();
    48. mediaMuxer.writeSampleData(videoTrackIndex, buffer, info); //写入数据
    49. mediaExtractor.advance(); //下一帧
    50. }
    51. mediaExtractor.release();
    52. mediaMuxer.stop();
    53. mediaMuxer.release();
    54. MediaScannerConnection.scanFile(MainActivity.this, new String[]{ output_path }, null, null);
    55. Toast.makeText(getApplicationContext(), "视频生成完成:" + output_path, Toast.LENGTH_SHORT).show();
    56. } catch (Exception e) {
    57. //java.io.IOException: Failed to instantiate extractor.
    58. Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
    59. Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
    60. }
    61. }

    选择视频文件

    1. String input_path = "";
    2. void chooseFile() {
    3. int CHOOSE_VIDEO = 200;
    4. Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
    5. startActivityForResult(intent, CHOOSE_VIDEO);
    6. }
    7. @Override
    8. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    9. super.onActivityResult(requestCode, resultCode, data);
    10. if (resultCode == RESULT_OK) {
    11. Uri uri = data.getData();
    12. String[] proj = { MediaStore.Video.Media.DATA };
    13. Cursor cursor = managedQuery(uri, proj, null, null, null);
    14. int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
    15. cursor.moveToFirst();
    16. input_path = cursor.getString(column_index);
    17. Log.e(Thread.currentThread().getStackTrace()[2] + "", input_path);
    18. }
    19. }

  • 相关阅读:
    一点一点学习C++之笔记004
    stress、mpstat、pidstat
    【学习笔记】Spring Security 01 认识Spring Security的重要特征(Features)
    如何使用zx编写shell脚本
    ARM可用的可信固件项目简介
    阿里内部流传的JDK源码剖析手册,GitHub已获上千万的访问量
    HS-ResNet: Hierarchical-Split Block on Convolutional Neural Network
    Upload-labs靶场
    实现的一个网页版的简易表白墙
    【论文笔记】—低光图像增强—Supervised—URetinex-Net—2022-CVPR
  • 原文地址:https://blog.csdn.net/sonichty/article/details/132641617