关于MediaRecorder中的setAudioEncoder和setOutputFormat

很久没有更新博客了,最近实习一直挺忙的。最近做的项目有关使用了录音类MediaRecorder。其中有个setAudioEncoder设置编解码器和setOutputFormat和输出格式。不太明白这之间有什么约束,但是总觉得不可能是随便设置的但是Google怎么都搜不到这方面相关的,于是去稍微了解了下编码解码器的区别以及它的输出容器。这里自己记录下,也方便大家有个了解。

MediaRecorder.OutputFormat先看看包含的格式(总计8个)

  • AAC_ADTS
    • .aac
  • AMR_NB
    • .3gp
  • AMR_WB
    • .3gp
  • DEFAULT
  • MPEG_2_TS
    • .ts
  • MPEG_4
    • .mp4
    • .m4a
  • RAW_AMR(此常数在API级别16中已被弃用)
    • .3gp
  • THREE_GPP
    • .3gp
  • WEBM
    • .ogg
    • mkv

MediaRecorder.AudioEncoder先看看包含的编解码器(总计7个)

  • AAC(AAC低复杂度(AAC-LC)音频编解码器)
  • AAC_ELD(增强型低延迟AAC(AAC-ELD)音频编解码器)
  • AMR_NB(AMR(窄带)音频编解码器)
  • AMR_WB(AMR(宽带)音频编解码器)
  • DEFAULT
  • HE_AAC(高效率AAC(HE-AAC)音频编解码器)
  • VORBIS(Ogg Vorbis音频编解码器)

这就介绍完了,到这里我们可以关闭网页了。放下砖,让我慢慢说,我们稍微深入的去看看这些编解码的东西

  • AAC
  • 采用了全新的算法进行编码,更加高效,具有更高的“性价比”。
  • 优点:相对于mp3,AAC格式的音质更佳,文件更小。
  • 缺点:AAC属于有损压缩的格式。
    • 其设计目标是替代原有MP3编码标准,在与MP3在相似的码率下希望质量优于MP3。这一目标已达到并且由ISO和IEC标准组织标准化在MPEG-2和MPEG-4中。
    • 支持的文件类型/容器格式
      • •3GPP
        • .3gp
      • •MPEG-4
        • .mp4
        • .m4a
      • •ADTS原始AAC
        • .aac(在Android 3.1+中解码,在Android 4.0+中编码,不支持ADIF)
        • ADTS(Audio Data Transport Stream):这种格式的特征是它有一个同步的字的比特流,解码器可以在这个流中任何开始位置开始。
        • DAIF:模拟数据交换模式
      • •MPEG-TS
        • .ts (not seekable,Android 3.0+)
    • 然后还有大致3个版本
      • AAC_LC
        • AAC低复杂度(AAC_LC)音频编解码器
        • 设计用于数字电视,AAC_LC用于存储空间和计算能力有限的情况。
        • AAC-LC是充分利用心理声学原理,对人类对音频信号的感知存在不相干性和统计冗余的特性,最大程度的减少用于表达信号的比特数据,实现音频信号快速有效地压缩,而不再追求输出信号和原始信号相似度。
        • 重要技术点
        • 支持从8到48 kHz的标准采样率的单声道/立体声/ 5.0 / 5.1内容。
      • HE_AAC
        • 高效率AAC(HE-AAC)音频编解码器
        • 分为两个版本
          • HE_AACV1(编码器 Android4.1+)
            • 支持从8到48 kHz的标准采样率的单声道/立体声/ 5.0 / 5.1内容。
          • HE_AACV2(增强的AAC+)
            • 支持从8到48 kHz的标准采样率的立体声/ 5.0 / 5.1内容。
          • 对比与AAC_LC
            • 同等音频,音频文件体积(低码率下比较明显):AAC_LC > HE_AAC
            • 算法复杂度:AAC_LC < HE_AAC
            • 更加详细的性能对比
      • AAC_ELD
        • 增强型低延迟AAC(AAC-ELD)音频编解码器
        • 编码器:(Android 4.1+)
        • 解码器:(Android 4.1+)
        • 支持从16到48 kHz的标准采样率的单声道/立体声内容
        • 能提供跟CD一样的音频质量,让用户获得无与伦比的通信体验。是唯一被广泛采用的全高清语音技术。
  • AMR_NB
    • AMR(窄带)音频编解码器
    • 主要用于第三代移动通信 W-CDMA 系统中
    • AMR-NB 支持八种速率模式。使其以更加智能的方式解决信源和信道编码的速率分配问题,根据无线信道和传输状况来自适应地选择一种编码模式进行传输,使得无线资源的配置与利用更加灵活有效。
      • 模式 0(4.75kbit/s)
      • 模式 1(5.15kbit/s)
      • 模式 2(5.90kbit/s)
      • 模式 3(6.70kbit/s)
      • 模式 4(7.40kbit/s)
      • 模式 5(7.95kbit/s)
      • 模式 6(10.2kbit/s)
      • 模式 7(12.2kbit/s)
    • 在8kHz采样时为4.75至12.2 kbps
    • 支持的文件类型/容器格式
      • 3GPP
        • .3gp
  • AMR_WB
    • AMR(宽带)音频编解码器
    • 作为第三代移动通信系统使用的语音编解码算法
    • AMR-WB 音频带宽在 50Hz-7000Hz,相对于 200Hz-3400Hz 为宽带,支持九种速率模式
      • 模式 0(6.60kbit/s)
      • 模式 1(8.85kbit/s)
      • 模式 2(12.65kbit/s)
      • 模式 3(14.25kbit/s)
      • 模式 4(15.85kbit/s)
      • 模式 5(18.25kbit/s)
      • 模式 6(19.85kbit/s)
      • 模式 7(23.05kbit/s)
      • 模式 8(23.85kbit/s)
    • 采用的是代数码激励线性预测编码(Algebraic Code ExcitedLinear Prediction,简称 ACELP),其已被 3GPP选定为GSM和3G无线W-CDMA的宽带编码器,并将应用于IP电话、第三代移动通信、ISDN 宽带电话、ISDN 可视电话和电视会议等领域,这标志着无线和有线业务第一次采用同样的编码器。
    • 9个速率从6.60 kbit / s到23.85 kbit / s采样@ 16kHz
    • 支持的文件类型/容器格式
      • 3GPP
        • .3gp
    • AMR_WB和AMR_NB更多详情
  • VORBIS
    • Ogg Vorbis音频编解码器。
    • Ogg Vorbis是一种新的音频压缩格式,类似于MP3等现有的音乐格式。
    • 它是完全免费、开放和没有专利限制的。
    • 支持多声道。
    • 更低的码率和文件体积。
    • Ogg Vorbis文件的扩展名是.ogg。
    • 现在创建的OGG文件可以在未来的任何播放器上播放,因此,这种文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。
    • 支持的文件类型/容器格式
      • •Ogg
        • .ogg
      • •Matroska
        • .mkv (Android 4.0+)
        • Matroska是一种新的多媒体封装格式,它可将多种不同编码的视频及16条以上不同格式的音频和不同语言的字幕流封装到一个Matroska Media文件当中。也是其中一种开放源代码的多媒体封装格式。

总结说明

  • 通过以上整理,我们在使用mediaRecord的时候,就不会盲目去设置AudioEncoder和OutputFormat了,而是根据实际情况来使用。
  • 设置的支持的文件类型/容器格式请参考Google官方文档
  • 整理的笔记如果错误的地方,请一起交流讨论共同进步,谢谢。
  • 以上资料均来自网络整理,如有侵权请告知。
发布了43 篇原创文章 · 获赞 58 · 访问量 11万+
展开阅读全文

hadoop 设置输出文件格式,job.setOutputFormatClass(SequenceFileOutputFormat.class); 报错

06-19

hadoop 2.9.2 版本 设置输出输出文件格式时,可以 job.setOutputFormatClass(TextOutputFormat.class); // 默认的输出组件 但是,job.setOutputFormatClass(SequenceFileOutputFormat.class); 这样时,会报错。看其他人的博客,可以这样设置。 错误提示: The method setOutputFormatClass(Class<? extends OutputFormat>) in the type Job is not applicable for the arguments (Class<SequenceFileOutputFormat>) ``` package cn.edu360.mr.indexSequance; import java.io.File; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.SequenceFileOutputFormat; import org.apache.hadoop.mapreduce.InputSplit; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.FileSplit; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; /** * 构建倒排索引,产生结果; hello a.txt->3 b.txt->4 * * 分两步, * 一 * map: 产生K: 单词+文档 V:次数(1) * reduce: 产生 K:单词+文档 V:总次数 * *二 * map: 产生 K:单词 V:文档 在文档中出现的次数 * reduce : 输出 单词 文档, 文档中出现的次数 * * * @author Administrator * */ public class IndexStep1 { /** * 分割单词, * 输出 单词+文档 次数 1 * @author Administrator * */ public static class IndexMapper1 extends Mapper<LongWritable, Text, Text, IntWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 获取maptask所处理的数据任务上下文信息: 文件路径, 偏移量范围 // 若访问数据为数据库,则为: 库名, 表名, 行范围 InputSplit inputSplit = context.getInputSplit(); // InputSplit为抽象类 FileSplit fileSplit = (FileSplit) inputSplit; // 强转inputSplit为FileSplit类型, FileSplit为InputSplit的实现类,针对文件 String filename = fileSplit.getPath().getName(); // 获取文件名 String line = value.toString(); String[] words = line.split(" "); for (String word : words) { word = format(word); if (word.length() >2) { context.write(new Text(word + "-" + filename), new IntWritable(1)); } } } } /** * 统计文档+单词 * * 输出: K:文档+单词 V: 单词在该文档中出现的总次数 * @author Administrator * */ public static class IndexReduce1 extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int count = 0; for (IntWritable value : values) { count = count + value.get(); } context.write(key, new IntWritable(count)); } } public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration configuration = new Configuration(); JobConf jobConf = new JobConf(configuration); Job job = Job.getInstance(configuration); job.setMapperClass(IndexMapper1.class); job.setReducerClass(IndexReduce1.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); File file = new File("d:\\testOut"); if (file.exists()) { deleteDir(file); } job.setOutputFormatClass(TextOutputFormat.class); // 默认的输出组件 job.setOutputFormatClass(SequenceFileOutputFormat.class); FileInputFormat.setInputPaths(job, new Path("d:\\test1")); FileOutputFormat.setOutputPath(job, new Path("d:\\testOut")); job.waitForCompletion(true); } // 使用正则表达式去除标点符号,大写转小写 public static String format(String s) { String str = s.replaceAll("\\pP|\\pS", ""); return str.toLowerCase(); // 大写转小写 } /** * 递归删除文件夹及文件下的所有文件 * @param dir * @return */ private static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); // 递归删除目录中的子目录下 for (int i=0; i<children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } // 目录此时为空,可以删除 return dir.delete(); } } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览