Android之音频和视频的提取

权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />private boolean checkPermission() {return ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == 101 && grantResults.length > 0) {if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {showShortToast("权限申请成功");} else {showShortToast("权限申请拒绝");}}
}

将视频音频分离开

将视频和音频分离开

private void splitMediaToVideoAndRadio(){// 视频提取器MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource(getFileDirPath()+File.separator + "source_demo.mp4");} catch (IOException e) {e.printStackTrace();showShortToast("视频资源路径出错");}// 获取通道数int trackCount = extractor.getTrackCount();// 视频轨道索引int videoTrackIndex = 0;// 视频格式MediaFormat videoMediaFormat = null;// 音频轨道索引int audioTrackIndex = 0;// 音频格式MediaFormat audioMediaFormat = null;// 查找需要的视频轨道与音频轨道indexfor (int i = 0; i < trackCount; i++) { //遍历所以轨道MediaFormat itemMediaFormat = extractor.getTrackFormat(i);String itemMime = itemMediaFormat.getString(MediaFormat.KEY_MIME);if (itemMime.startsWith("video")) { //获取视频轨道位置videoTrackIndex = i;videoMediaFormat = itemMediaFormat;Log.d(TAG,"video format start --- ");Log.d(TAG,"video format --> \r\n"+itemMediaFormat.toString());Log.d(TAG,"video format end --- ");}else if (itemMime.startsWith("audio")) { //获取音频轨道位置audioTrackIndex = i;audioMediaFormat = itemMediaFormat;Log.d(TAG,"audio format start --- ");Log.d(TAG,"audio format --> \r\n"+itemMediaFormat.toString());Log.d(TAG,"audio format end --- ");}}File outVideoFile = new File(getFileOutPath() + File.separator + "video.h264");File outRadioFile = new File(getFileOutPath() + File.separator + "audio.acc");if(outVideoFile.exists()){outVideoFile.delete();}if(outRadioFile.exists()){outRadioFile.delete();}try{FileOutputStream videoOutputStream = new FileOutputStream(outVideoFile);FileOutputStream radioOutputStream = new FileOutputStream(outRadioFile);// 分离视频// 获取视频输出缓存的最大大小int maxVideoBufferCount = videoMediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);ByteBuffer videoByteBuffer = ByteBuffer.allocate(maxVideoBufferCount);extractor.selectTrack(videoTrackIndex);int length;while ((length = extractor.readSampleData(videoByteBuffer,0)) != -1){byte [] bytes = new byte[length];// 获取字节videoByteBuffer.get(bytes);// 写入字节videoOutputStream.write(bytes);videoByteBuffer.clear();// 预先加载后面的数据extractor.advance();}videoOutputStream.flush();videoOutputStream.close();extractor.unselectTrack(videoTrackIndex);// 分离音频int maxAudioBufferCount = audioMediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);//获取音频的输出缓存的最大大小ByteBuffer audioByteBuffer = ByteBuffer.allocate(maxAudioBufferCount);extractor.selectTrack(audioTrackIndex);//选择音频轨道while ((length = extractor.readSampleData(audioByteBuffer, 0)) != -1) {byte[] bytes = new byte[length];audioByteBuffer.get(bytes);// 添加adts头byte[] adtsData = new byte[length + 7];addADTStoPacket(adtsData, length+7);System.arraycopy(bytes, 0, adtsData, 7, length);radioOutputStream.write(bytes);audioByteBuffer.clear();extractor.advance();}radioOutputStream.flush();radioOutputStream.close();showShortToast("分离音频视频成功");}catch (Exception e){e.printStackTrace();showShortToast("分离音频视频失败");}
}private static void addADTStoPacket(byte[] packet, int packetLen) {/*标识使用AAC级别 当前选择的是LC一共有1: AAC Main 2:AAC LC (Low Complexity) 3:AAC SSR (Scalable Sample Rate) 4:AAC LTP (Long Term Prediction)*/int profile = 2;int frequencyIndex = 0x04; //设置采样率int channelConfiguration = 2; //设置频道,其实就是声道// fill in ADTS datapacket[0] = (byte) 0xFF;packet[1] = (byte) 0xF9;packet[2] = (byte) (((profile - 1) << 6) + (frequencyIndex << 2) + (channelConfiguration >> 2));packet[3] = (byte) (((channelConfiguration & 3) << 6) + (packetLen >> 11));packet[4] = (byte) ((packetLen & 0x7FF) >> 3);packet[5] = (byte) (((packetLen & 7) << 5) + 0x1F);packet[6] = (byte) 0xFC;
}

将视频分离成无声视频和音频

视频

private void generateMediaVideo(){// 视频提取器MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource(getFileDirPath()+File.separator + "source_demo.mp4");} catch (IOException e) {e.printStackTrace();showShortToast("视频资源路径出错");}// 获取通道数int trackCount = extractor.getTrackCount();// 视频轨道索引int videoTrackIndex = 0;// 视频格式MediaFormat videoMediaFormat = null;// 查找需要的视频轨道与音频轨道indexfor (int i = 0; i < trackCount; i++) { //遍历所以轨道MediaFormat itemMediaFormat = extractor.getTrackFormat(i);String itemMime = itemMediaFormat.getString(MediaFormat.KEY_MIME);if (itemMime.startsWith("video")) { //获取视频轨道位置videoTrackIndex = i;videoMediaFormat = itemMediaFormat;Log.d(TAG,"video format start --- ");Log.d(TAG,"video format --> \r\n"+itemMediaFormat.toString());Log.d(TAG,"video format end --- ");}}File outVideoFile = new File(getFileOutPath() + File.separator + "out_video.mp4");if(outVideoFile.exists()){outVideoFile.delete();}try{// 分离视频MediaMuxer mediaMuxer = new MediaMuxer(outVideoFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);int mVideoTrackIndex  = mediaMuxer.addTrack(videoMediaFormat);mediaMuxer.start();MediaCodec.BufferInfo info =  new MediaCodec.BufferInfo();info.presentationTimeUs =  0;extractor.selectTrack(videoTrackIndex);int videoFlag = extractor.getSampleFlags();long videoFrameRate = 1000 * 1000 /(videoMediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE));int length;ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);while ((length = extractor.readSampleData(buffer,0)) != -1){info.offset = 0;info.size = length;info.flags = videoFlag;info.presentationTimeUs += videoFrameRate;mediaMuxer.writeSampleData(mVideoTrackIndex, buffer, info);// 预先加载后面的数据extractor.advance();}extractor.release();mediaMuxer.stop();mediaMuxer.release();showShortToast("生成视频文件成功");}catch (Exception e){e.printStackTrace();showShortToast("视频生成失败");}
}

音频

private void generateMediaRadio(){// 视频提取器MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource(getFileDirPath()+File.separator + "source_demo.mp4");} catch (IOException e) {e.printStackTrace();showShortToast("视频资源路径出错");}// 获取通道数int trackCount = extractor.getTrackCount();// 视频轨道索引int radioTrackIndex = 0;// 视频格式MediaFormat radioMediaFormat = null;long radioFrameRate = 0;// 查找需要的视频轨道与音频轨道indexfor (int i = 0; i < trackCount; i++) { //遍历所以轨道MediaFormat itemMediaFormat = extractor.getTrackFormat(i);String itemMime = itemMediaFormat.getString(MediaFormat.KEY_MIME);if (itemMime.startsWith("audio")) { //获取音频轨道位置radioTrackIndex = i;radioMediaFormat = itemMediaFormat;Log.d(TAG,"audio format start --- ");Log.d(TAG,"audio format --> \r\n"+itemMediaFormat.toString());Log.d(TAG,"audio format end --- ");extractor.selectTrack(i);long first_sampletime = extractor.getSampleTime();extractor.advance();long second_sampletime = extractor.getSampleTime();radioFrameRate = Math.abs(second_sampletime - first_sampletime);//时间戳extractor.unselectTrack(i);}}File outVideoFile = new File(getFileOutPath() + File.separator + "out_audio.mp4");if(outVideoFile.exists()){outVideoFile.delete();}try{// 分离音频MediaMuxer mediaMuxer = new MediaMuxer(outVideoFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);int mVideoTrackIndex  = mediaMuxer.addTrack(radioMediaFormat);mediaMuxer.start();MediaCodec.BufferInfo info =  new MediaCodec.BufferInfo();info.presentationTimeUs =  0;extractor.selectTrack(radioTrackIndex);int videoFlag = extractor.getSampleFlags();int length;ByteBuffer buffer = ByteBuffer.allocate(100 * 1024);while ((length = extractor.readSampleData(buffer,0)) != -1){info.offset = 0;info.size = length;info.flags = videoFlag;info.presentationTimeUs += radioFrameRate;mediaMuxer.writeSampleData(mVideoTrackIndex, buffer, info);// 预先加载后面的数据extractor.advance();}extractor.release();mediaMuxer.stop();mediaMuxer.release();showShortToast("音频生成成功");}catch (Exception e){e.printStackTrace();showShortToast("音频生成失败");}
}

Android之音频和视频的提取相关推荐

  1. 视频提取音频 - 手机视频在线提取音频提取器

    怎样将视频中的音频提取出来?一刀工具箱提供一键可将手机相册中的视频提取音频,便捷的快速获取到视频中的音频文件,视频提取音频的软件,免费转换 mp3 格式的工具. 代码片段 buildVideo(){l ...

  2. FFmpeg 使用命令整理 – 提取音频或视频、提取图片、格式转换等

    提取声音的软件网上搜索有不少,不过最有名最专业的似乎是一个命令行工具:ffmpeg.这个工具功能十分丰富且强大,我所需要的从视频中提取 mp3 的功能只是其中包含的一个.感觉使用起来很复杂因为是命令行 ...

  3. 【FFmpeg 命令】提取音频或视频、提取图片、格式转换等

    文章目录 1. FFmpeg 简介 2. 组件组成 3. 命令参数 3.1 主要参数 3.2 影像参数 4. 实战使用 4.1 格式转换 (将file.avi 转换成output.flv) 4.2 合 ...

  4. Android 音视频配音之音频提取、截断、混音、合并、合成(一)——从视频中提取音频文件

    目录 前言 提取前提----了解提取需要用到的工具类:MediaExtractor.MediaCodec 1.MediaExtractor 2.MediaCodec 3.释放 具体提取转码代码 调用 ...

  5. Android开发记录:视频提取音频

    文章目录 前言 使用方法 前言 Android开发中从视频中提取音频主要有三种方式结合FFmpeg,MP4Parser,MediaExtractor. 多媒体视频处理工具FFmpeg有非常强大的功能包 ...

  6. Android音频和视频开发

    # 前言 在如今快节奏,网络发达的社会.人们对于静态的图片和文字往往很难有精力去安心完整的阅读完网上内容.为了满足人们可以更生动的阅读网上的内容,也为了使网络交互更加生动.我们便需要应用到音频和视频来 ...

  7. Android中从视频中提取音频

    最近在做一款产品,需要从视频中提取音频.查了查资料发现了有FFMPEG,MP4Parser,Android自带的解码器.首先FFMPEG比较复杂据说也慢(来源于互联网,我也不知道)然后就是Androi ...

  8. android播放mp3方法,Android之MediaPlayer播放音频与视频

    本节带来的是Android多媒体中的--MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放 ...

  9. python从视频中提取音频_提取视频中的音频——python三行程序搞定!

    原标题:提取视频中的音频--python三行程序搞定! 写在开头 身处数据爆炸增长的时代,各种各样的数据都飞速增长,视频数据也不例外.我们可以使用 python 来提取视频中的音频,而这仅仅需要安装一 ...

  10. android高仿微信视频编辑页-视频多张图片提取

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

最新文章

  1. 命名实体识别NER 如何使用BERT实现
  2. 【解决线程安全问题:通过Lock锁对象】
  3. 第四季度数据中心网络设备销量达35亿美元
  4. 在SAP Business Application Studio里创建Fiori应用的操作流程
  5. 利用python画分形图_使用 Python 绘制 Mandelbrot 分形图
  6. nvarchar(max)和表扫描
  7. 博客开张第一贴!谢谢!大伙多多关照!谢谢.
  8. [区块链] 拜占庭将军问题 [BFT]
  9. 【NOIP2004】【Luogu1090】合并果子
  10. 3.React学习笔记(完)----nodejs命令备份+跨域问题处理
  11. JAVA开发一个合并单元格报表,纵向同值单元格的合并
  12. rsync+inotify实现数据实时同步备份
  13. python制作小游戏大全_python制作小游戏(一)
  14. Java二叉树的最大深度
  15. 使用CentOS7搭建Nat64服务器实现IPv6网段访问IPv4地址
  16. 你还在用乞丐版的深拷贝么
  17. pacman 查询_Pacman 命令记录
  18. java blowfish ecb,来自blowfish / base64的解密消息时出错
  19. python re 中文_python处理中文编码
  20. 转载:内外兼修:Oracle ACED熊军谈Oracle学习

热门文章

  1. mac 上装windows系统 win10 没声音 耳机也没声音
  2. matlab雷达辐射源,雷达辐射源PDW数据分析系统的制作方法
  3. java下载文件或文件夹
  4. html展示微信昵称特殊字符,微信昵称表情符号前端显示问题
  5. Java互联网架构师视频课程 分布式系统架构 Dubbo ActiveMQ Netty
  6. python 字符串(二)
  7. OpenGL 编程指南 ( 原书第 9 版 ) --- 第二章
  8. @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})的应用场景
  9. 10只狗怎么鉴别1000瓶水哪瓶有毒
  10. labview 编程样式_LabVIEW编程样式规则