Android开发之合并文件的几种方式

2023-11-18

下面介绍合并文件的几种方式,并通过合并amr文件来举例介绍合并文件的具体流程。amr格式的文件头是6字节,所以在进行文件合并的时候要减去除第一个文件以外的其他文件的文件头。

注意:不同文件的文件头是不一样的,所以在合并的时候根据不同文件相应的减去合并文件的文件头。

步骤一:获取要合并的文件及创建合并后保存的文件

[java]  view plain  copy  print ?
  1. /**用于存放要合并的文件的集合**/  
  2. List<File>tempFiles=new ArrayList<File>();  
  3. /**合并之后的文件**/  
  4. File finalFile;  
[java]  view plain  copy  print ?
  1. /** 
  2.  * 创建用于合并之后的文件 
  3.  * @param isTempFile 是否为临时文件 
  4.  * @return soundFile File 
  5.  * */  
  6. private File getFile(boolean isTempFile) {  
  7.     // TODO Auto-generated method stub        
  8.     finalFile=null;  
  9.     if (!Environment.getExternalStorageState().  
  10.             equals(Environment.MEDIA_MOUNTED)) {  
  11.         Log.w("Waring""检测到你的手机没有插入SD卡,请插入SD后再试!");  
  12.     }         
  13.     //获取系统的24小时制时间作为文件名(HH为24小时制,hh为12小时制)  
  14.     SimpleDateFormat simpleDateFormat=new SimpleDateFormat(  
  15.             "yyyy-MM-dd-HH-mm-ss",Locale.getDefault());       
  16.     String fileName=simpleDateFormat.format(new Date())+".amr";   
  17.     if (isTempFile) {//如果是临时文件  
  18.         fileName="temp"+fileName;  
  19.     }  
  20.     try {  
  21.         File parentFile= new File(Environment.getExternalStorageDirectory()  
  22.                 .getCanonicalFile()+"/"+"Recorder");  
  23.         if (!parentFile.exists()||parentFile==null) {//如果目录不存在  
  24.             parentFile.mkdirs();//创建parentFile目录  
  25.         }  
  26.         finalFile=new File(parentFile, fileName);  
  27.     } catch (IOException e) {  
  28.         // TODO Auto-generated catch block  
  29.         e.printStackTrace();  
  30.     }             
  31.     return finalFile;     
  32. }  

步骤二:合并文件

方式一: 通过FileOutputStream、与FileInputStream方式

[java]  view plain  copy  print ?
  1. /** 
  2.  * 通过FileOutputStream、与FileInputStream方式 
  3.  * 将多个文件进行合并,并删除原文件 
  4.  * */  
  5. public void mergeFiles1() {  
  6.     // TODO Auto-generated method stub  
  7.     if (tempFiles.isEmpty()) return;//如果还没录制则,不进行合并  
  8.     File realFile=getFile(false);  
  9.     try {  
  10.         FileOutputStream fos=new FileOutputStream(realFile);          
  11.         for (int i = 0; i < tempFiles.size(); i++) {//遍历tempFiles集合,合并所有临时文件               
  12.             FileInputStream fis=new FileInputStream(tempFiles.get(i));  
  13.             byte[] tmpBytes = new byte[fis.available()];  
  14.             int length = tmpBytes.length;//文件长度  
  15.             //头文件  
  16.             if(i==0){  
  17.                 while(fis.read(tmpBytes)!=-1){  
  18.                     fos.write(tmpBytes,0,length);  
  19.                 }  
  20.             }                     
  21.             //之后的文件,去掉头文件就可以了.amr格式的文件的头信息为 6字节  
  22.             else{  
  23.                 while(fis.read(tmpBytes)!=-1){                        
  24.                     fos.write(tmpBytes,6,length-6);  
  25.                 }  
  26.             }                 
  27.             fos.flush();  
  28.             fis.close();          
  29.         }  
  30.         fos.close();//所有的文件合并结束,关闭输出流  
  31.         Log.i("info""此次录音文件:"+realFile.getName()+" 已保存到:"+  
  32.                 realFile.getAbsolutePath()+"目录下");  
  33.     } catch (Exception e) {  
  34.         // TODO Auto-generated catch block  
  35.         e.printStackTrace();  
  36.     }  
  37.     //删除合并过的临时文件  
  38.     for (File file:tempFiles) {  
  39.         if (file.exists()) {  
  40.             file.delete();  
  41.         }  
  42.     }  
  43. }  

方式二:  通过FileChannel方式

[java]  view plain  copy  print ?
  1. /** 
  2.  * 通过FileChannel方式 
  3.  * */  
  4. public void mergeFiles2() {  
  5.     File realFile=getFile(false);  
  6.     FileChannel mFileChannel;  
  7.     try {  
  8.         FileOutputStream fos=new FileOutputStream(realFile);              
  9.         mFileChannel=fos.getChannel();        
  10.         FileChannel inFileChannel;  
  11.         for(File file:tempFiles){               
  12.             inFileChannel=new FileInputStream(file).getChannel();  
  13.             //下面应该根据不同文件减去相应的文件头(这里没有剪去文件头,实际应用中应当减去)  
  14.             inFileChannel.transferTo(0, inFileChannel.size(), mFileChannel);                   
  15.             inFileChannel.close();  
  16.         }         
  17.         fos.close();  
  18.         mFileChannel.close();  
  19.     } catch (Exception e) {  
  20.         // TODO Auto-generated catch block  
  21.         e.printStackTrace();  
  22.     }  
  23. }  

方式三: 通过RandomAccessFile方式

[java]  view plain  copy  print ?
  1. /** 
  2.  * 通过RandomAccessFile方式 
  3.  * */  
  4. public void mergeFiles3() {  
  5.     try{                  
  6.         File realFile=getFile(false);  
  7.         FileOutputStream fos = new FileOutputStream(realFile);  
  8.         RandomAccessFile ra = null;  
  9.         for (int i = 0; i < tempFiles.size(); i++) {               
  10.             ra = new RandomAccessFile(tempFiles.get(i), "r");  
  11.             if (i != 0) {  
  12.                 ra.seek(6);//跳过amr文件的文件头  
  13.             }  
  14.             byte[] buffer = new byte[1024 * 8];  
  15.             int len = 0;  
  16.             while ((len = ra.read(buffer)) != -1) {  
  17.                 fos.write(buffer, 0, len);  
  18.             }  
  19.        }  
  20.        ra.close();  
  21.        fos.close();  
  22.       } catch (Exception e) {  
  23.           e.printStackTrace();  
  24.       }       
  25. }  


from: http://blog.csdn.net/fengyuzhengfan/article/details/38678005


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开发之合并文件的几种方式 的相关文章

  • webrtcvad 安装失败

    倒腾了两个小时终于解决了这个问题 所有办法都试了 只有这个管用 下载安装VC 不要下载那种在线安装的 我试了很多次 都是安装包丢失或损坏 直接复制下面链接去下载 百度网盘链接 https pan baidu com s 1IaqkukMzb
  • Wwise指引贴

    几种音频软件的比较 Criware音频引擎跟Wwise在功能上有什么直接的区别么 为什么很多大厂都选择Wwise
  • 音频系统POP音的原理和解决方法

    音频系统POP音的原理和解决方法 目录 文章目录 音频系统POP音的原理和解决方法 目录 音频IC与功放IC的电源时序与功能模块使能时序 功放IC输入端INP与INN的阻抗匹配 增大VBIAS滤波电容 BTL输出和SE输出 减小输出端耦合电
  • 关于安卓上pcm文件转wav全是噪音解决办法

    1 一开始发现8bit的pcm能正常转换 但换成16bit转换出来全是噪音 网上资料也不全 思考了很久 突然想起大小端的问题 进行大小端处理后再进行转换 完美播放 下面贴出大小端转换方法 public class BigorLittle p
  • 【C】借助DirectSound进行流的形式无缝播放的例子

    DirectSound是DirectX的一个组件 用于播放声音 BGM等 和DirectMusic不一样 DirectSound用于播放波形声音 WAV无损等 而不是midi音乐 通常大家使用DirectSound是直接把一个声波数据全部载
  • 实时音频编程(一)

    系列文章目录 实时音频编程 一 实时音频编程 二 实践与技巧 文章目录 系列文章目录 简介 实时系统 实时系统的分类 实时音频系统 什么会产生 glitch 阻塞 算法的最坏时间复杂度 锁 不使用锁的第一个原因 优先级倒置 不使用锁的第二个
  • 运用Microsoft.DirectX.DirectSound和Microsoft.DirectX实现简单的录音功能

    1 首先要使用Microsoft DirectX DirectSound和Microsoft DirectX这两个dll进行录音 需要先安装microsoft directx 9 0cz这个组件 百度云盘下载地址 http pan baid
  • HTML5实现音频和视频嵌入

    简介 HTML5未出来之前 在线的音频和视频都是借助Flash或者第三方工具实现的 现在HTML5也支持了这方面的功能 在一个支持HTML5的浏览器中 不需要安装任何插件就能播放音频和视频 原生的支持音频和视频 为HTML5注入了巨大的发展
  • C#音频采集 (笔记)

    using System using System Collections Generic using System Text using System IO using System Threading using Microsoft D
  • Ubuntu13下调试USB AUDIO的一些记录

    最近想玩玩LINUX 于是双系统装了一个Ubuntu13 04 在新系统下用着都还好 不过我自己DIY的USB DAC出了问题 在WIN7下能正常工作 但是在Ubuntu下就爆音不断 很明显是音频数据流断流引起的 这说明stm32上的固件与
  • 音频——WAV 格式详解

    文章目录 WAV 文件格式解析 概述 块解析 RIFF chunk fmt chunk data chunk 示例分析 代码解析 WAV 文件格式解析 概述 wav 文件支持多种不同的比特率 采样率 多声道音频 WAV 文件格式是 Micr
  • python:pydub模块

    一 安装 1 安装模块 pip install pydub 2 安装插件 云盘中下载文件ffmpeg 打开电脑上的控制面板 系统 高级系统设置 环境变量 然后双击path 看到如下的界面 然后点新建会出现一个新建的地址栏 你需要在这个新建地
  • C++ 播放音频流(PCM裸流)

    直接上代码 如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了 注意将声道和频率与你自己的文件对应 当然我自己也用VS2008写了个例子上传了 如果有需要下载地址如下 点击打开链接 这份代码是打开文件截取一段数
  • BES提示音修改实验

    加v hezkz17 进数字音频系统答疑群 1 普通提示音切换需要注意的 比如切换不同的音频信号源注意先要app audio list clear 然后再切换音频app audio manager sendrequest APP BT ST
  • Java把V3音频文件转化为wav文件的算法的代码

    将写内容过程经常用到的内容段做个备份 如下内容内容是关于Java把V3音频文件转化为wav文件的算法的内容 import java io BufferedInputStream import java io BufferedOutputSt
  • 麦克输入

    如图所示 单端输入只有一个输入引脚ADCIN 使用公共地GND作为电路的返回端 ADC的采样值 ADCIN电压 GND的电压 0V 这种输入方式优点就是简单 缺点是如果vin受到干扰 由于GND电位始终是0V 所以最终ADC的采样值也会随着
  • 实时音视频的那些事儿(三)—— 音频编码

    前言 上一篇文章 实时音视频的那些事儿 二 音频采集 中我们讲到了如何在iOS Android Windows平台实现音频采集 今天将介绍如何实现音频的编码 一 iOS 中使用 AudioUnit 实现音频编码的过程 AudioUnit 是
  • 基于音频和文本的多模态语音情感识别(一篇极好的论文,值得一看哦!)

    基于音频和文本的多模态语音情感识别 语音情感识别是一项具有挑战性的任务 在构建性能良好的分类器时 广泛依赖于使用音频功能的模型 本文提出了一种新的深度双循环编码器模型 该模型同时利用文本数据和音频信号来更好地理解语音数据 由于情感对话是由声
  • FMOD Core API 指南

    目录 3 Core API 指南 3 1 什么是 Core API 3 2 链接的插件 3 2 1 静态 3 2 2 动态 3 3 API 功能
  • 解决:soundfile打开opus文件出错: File contains data in an unimplemented format.

    Python的soundfile库依赖于libsndfile库 需要安装最新版本 sudo apt get update sudo apt get install libsndfile1 如果之前已经安装soundfile 则可能采用了旧版

随机推荐

  • 证明:Java代码在执行过程中,并不一定是从上到下,每句代码依次顺序执行的

    今天给大家带来一个毁三观的结论 Java代码在执行过程中 并不一定是从上到下 每句代码依次顺序执行的 这是不是很颠覆你的认知 计算机在执行程序的时候 并不会严格按照代码来顺序执行 比如第一个指令 是从内存中读取一个数据 而第二个指令 是寄存
  • zabbix设定监控指标每天调用一次

    添加了数据库备份的监控项 因为备份每天只做一次 如果一直取数意义不大 所以设定在每条早上9点取一次值 设定方式如图 更新间隔需要修改为0 否则还会按照间隔获取信息 选择调度 h表示小时 h9表示每天九点
  • 蓝桥杯第十一届青少年Python组省赛试题

    选择题答案 ADDCA s input if s 2 er or s 2 ly s s 2 elif s 3 ing s s 3 print s n int input cnt 0 for i in range 2 n s 0 for j
  • Unity平台如何实现RTSP转RTMP推送?

    技术背景 Unity平台下 RTSP RTMP播放和RTMP推送 甚至包括轻量级RTSP服务这块都不再赘述 今天探讨的一位开发者提到的问题 如果在Unity下 实现RTSP播放的同时 随时转RTMP推送出去 RTSP转RTMP 在原生环境下
  • 开始做一个平台程序

    先赚个积分吧 公司的项目 从0开始
  • BP、CNN、ResNet:图片分类FashionMnist和CIFAR-10

    源码 GitHub jeanMrx FashionMnist CIFAR10 一 实验目的 理解BP神经网络和卷积神经网络的结构和原理 掌握反向传播学习算法对神经元的训练过程 了解损失函数的反向传播和梯度下降 通过构建BP神经网络和卷积神经
  • Ubuntu Desktop 启用远程桌面(Vino和TigerVNC方式)

    文章目录 前言 使用Vino方式 无显示器使用 使用TigerVNC方式 前言 在很多领域的生产开发工作中常常需要用到 Ubuntu Desktop 系统 但是在一些日常的工作交流中又离不开Windows系统 这种时候比较常用的解决方案就是
  • ElasticSearch-DSL语句使用-Kibana界面操作

    Query DSL结构化查询介绍 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句 采用API代替传统的拼接字符串来构造查询语句 目前Querydsl支持的平台包括JPA JDO SQL Java Collectio
  • R语言数据分析案例合集

    案例一 汽车数据可视化分析 R ggplot2 案例二 房价指数的分析与预测 时间序列
  • 简单了解照相机

    以上是随便找网上找的一张正经的照相机图片 如今照相机各种各样 今天我们会简单了解一下照相机的工作原理 涉及的工作原理 主要是这两个原理 话说很早很早的时候 我们的老祖宗 墨子就发现了 用一个带有小孔的板遮挡在墙体与物体之间 墙体上就会形成物
  • idea中使用git stash和git unstash

    一 git中没有提交到本地仓库的改变内容会带到别的分支 git 切换分支时会把未add或未commit的内容带过去 这样可能造成代码覆盖的问题 这个在工作中会经常遇到 二 对本地仓库的文件进行了修改 但没有提交到本地仓库 切换分支时会造成代
  • 小程序微信支付功能逻辑

    官方的思维图在下看不懂 自己整理一份以备后用 1 打开Pay付款页面 2 用订单号 查看订单信息前端展示 3 点击付款按钮 提交订单ID到后台 创建微信预支付交易订单 用JSAPI下单 4 返回创建后的 预支付订单编号信息 存入数据表 5
  • 用Python实现BP神经网络(附代码)

    用Python实现BP神经网络 附代码 大家好 我是毕加锁 锁 今天教大家用Python实现BP神经网络 附代码 用Python实现出来的机器学习算法都是什么样子呢 前两期线性回归及逻辑回归项目已发布 见文末链接 今天来讲讲BP神经网络 B
  • IntelliJ IDEA插件开发指南(一)

    概要 工欲善其事必先利其器 虽然IntelliJ IDEA的功能已经足够的强大 但是也无法满足开发人员想要的一切功能 对于此 IDEA提供了API接口供开发者进行插件开发扩展 但目前来说 网上对于IDEA插件开发的文档大多讲的不是很清楚 自
  • HTML,js,jQuery的1+S证书学习资料

    诸位 我是曜耀 今天为大家带来是关于大学期间考1 s证书的学习资料 1 S是教育部 国家发展改革委 财政部 市场监管总局联合印发 关于在院校实施 学历证书 若干职业技能等级证书 制度试点方案 部署启动 学历证书 若干职业技能等级证书 简称1
  • ‘gbk‘ codec can‘t decode byte 0xae in position 199: illegal multibyte sequen 问题解决

    在 机器学习实战 第四章中 使用朴素贝叶斯过滤垃圾邮件出现了 gbk codec can t decode byte 0xae in position 199 illegal multibyte sequen 错误 原因在于 email g
  • js url上添加随机数防止缓存

    1 通常使用ajax访问url添加 JS ajax请求地址后加随机参数 比如XXXX t new Date getTime 或者 在url后面加一个随机数 url test jsp number Math random 浏览器为了提高用户访
  • 芯片细分领域

  • 苹果笔记本怎么查看计算机基本信息,如何查询苹果电脑型号_查询苹果电脑型号的方法...

    新买入苹果电脑后无法确认是什么型号 虽然可以通过电脑外箱和机身标签识别 但此不够内容不够详细 那么还有什么办法查询苹果电脑型号呢 Mac的机型信息并不是直接可以在电脑的系统信息中查询到 而是根据Mac的信息来对比查询 下面快来看看操作方法
  • Android开发之合并文件的几种方式

    下面介绍合并文件的几种方式 并通过合并amr文件来举例介绍合并文件的具体流程 amr格式的文件头是6字节 所以在进行文件合并的时候要减去除第一个文件以外的其他文件的文件头 注意 不同文件的文件头是不一样的 所以在合并的时候根据不同文件相应的