音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)
前言:
前面我用了很多章实现了javaCV的基本操作,包括:音视频捕捉(摄像头视频捕捉和话筒音频捕捉),推流(本地音视频或者摄像头话筒混合推流到服务器),转流(rtsp->rtmp),收流(录制)。
序:
我们知道javaCV中编码需要先取到一帧采样的音频(即采样率x通道数,我们姑且把这个称为一帧采样数据)
其实我们在该篇文章http://blog.csdn.net/eguid_1/article/details/52804246中已经对音频进行转码了。
额。。这个真没看出来(PS:博主也没看出来 0_0 !)。。。。。。。。。
我们获取了本地的音频音频数据(具体啥编码博主也不晓得,只知道是16位的, - -! ,不过这不要紧,FFMPEG能我们实现,下面将会讲到 );
其中我们做了大小端序的转换和byte[]转short[](双8位转单16位),音频编解码中这个操作我们会经常用;
然后我们使用了recoder.reacordSimples(采样率,通道数,一份采样);
对比一下音频捕获的文章:http://blog.csdn.net/eguid_1/article/details/52702385
发现了吗?没错,我们给recorder设置了一些属性:
// 不可变(固定)音频比特率
recorder.setAudioOption("crf", "0");
// 最高质量
recorder.setAudioQuality(0);
// 音频比特率
recorder.setAudioBitrate(192000);
// 音频采样率
recorder.setSampleRate(44100);
// 双通道(立体声)
recorder.setAudioChannels(2);
// 音频编/解码器
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
看到了吗?我们其实已经设置了编/解码格式aac,为什么呢?因为javaCV已经封装了解复用和编码这两个操作。
补充:
补充一下javaCV底层的ffmpeg解复用/编码流程:
我们在进行recoder.reacordSimples的时候javaCV底层调用ffmpeg的swr_convert()方法(详见javaCV的FFmpegFrameRecoder类974行)进行了解码操作,完成了对pcm16le编码的解复用;
解码完成之后又调用了recorder.record(Frame frame)(详见javaCV的FFmpegFrameRecoder类994行),在这个环节完成了调用了FFMPEG的avcodec_encode_audio2()方法(详见javaCV的FFmpegFrameRecoder类1006行)按照我们已经设定好的的aac格式完成了编
码操作,所以我们本身是不需要进行解复用/编码的操作的(视频也是一样,以后会讲到),因为javaCV已经帮我门做了!
到这里肯定有些小伙伴已经5脸懵bi的状态了。。。 - -!,最不幸的是,上面一堆的前言和补充知识,我们的主题还没开始。 0_0 !
eguid唯一技术博客是csdn,博主唯一交流群是群号:371249677
(点击这里进群),欢迎大家来埋汰群主
1、java音频预处理
既然javaCV已经帮我门做了解复用和编码,那么我们只需要将获得到的音频数据进行简单的预处理即可。
注:如果是文件或者服务器直播流,那么连预处理都省了,直接设置编码格式即可,不需要我们手动做任何处理。
这里讲一下特殊的byte[]流,也就是基于socket的IO流形式的音频数据处理,一般我们使用这种的情况是移动端通过socket推流到中转服务器,让中转服务器进行转码推送到流媒体服务器。
1.1、如何从byte[]流中获取一份完整的音频帧(即一帧采样数据)
就拿 8000采样率,16bit,双通道(立体声)的pcm16le编码来说吧举例说明吧
我们知道这个音频采样率是8000,位数是16bit,2个通道,那么我们就知道这个编码的一帧就是(8000x2 )个byte
1.2、音频原始数据转换
一个byte只能表示8bit数据,我们要表示16位的音频数据就需要装换为short,一个short等于2个byte,在转换的同时进行大小端序转换(大小端序问题详见http://blog.csdn.net/eguid_1/article/details/52790848),那么我们最后得到的数据应该是一个长度是8000的short数组(即short[8000])来表示一帧音频采样数据。
音频的预处理到此完毕,接下来该javaCV出场了
2、javaCV音频解复用及编码
通过上面一大堆的前言,已经知道:音频数据直接通过recorder设置音频编码参数即可自动进行解复用和编码
只需要调用recorder.recordSamples(采样率,通道数量,一份采样数据)即可。
我的天呐,这真真是用一行代码解决了C/C++好几百行的事情!
音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)的更多相关文章
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- Android 音视频开发(三):使用 AudioTrack 播放PCM音频
一.AudioTrack 基本使用 AudioTrack 类可以完成Android平台上音频数据的输出任务.AudioTrack有两种数据加载模式(MODE_STREAM和MODE_STATIC),对 ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践
1.概述 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和WebRTC的技术特征.差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和WebR ...
- 腾讯技术分享:微信小程序音视频技术背后的故事
1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...
- 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...
- 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...
- Android音视频开发(1):H264 基本原理
前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...
- Android IOS WebRTC 音视频开发总结(七四)-- WebRTC开源5周年了,Google怎么看?
本文最早发表在我们的微信公众号上(微信ID:blackerteam),支持原创,详见这里, 2016年6月9日是WebRTC开源5周年的日子,Google WebRTC负责人Harald在社区里面写了 ...
随机推荐
- App内切换语言
前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...
- node-ejs-mongodb结合的项目案例-----引用mongoose和未引用mongoose模块
本项目个人尝试了2种方法,一个是直接用mongod,一个是引用mongod里的mongoose. nodejs-ejs-mogondb- nodej+ejs模板,通过mogondb数据查询数据实现简单 ...
- 开通阿里云 CDN
CDN,内容分发网络,主要功能是在不同的地点缓存内容,通过负载均衡技术,将用户的请求定向到最合适的缓存服务器上去获取内容,从而加快文件加载速度. 阿里云提供了按量计费的CDN,开启十分方便,于是我在自 ...
- Python数据处理——numpy_3
通过前面两次的学习,基本上对numpy有了一定的认识,所以,接下来进一步对numpy学习.同时,最后以一个有趣的例子加深对numpy的理解. import numpy as np xarr = np. ...
- LinkCode 下一个排列、上一个排列
http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列 ...
- vue 调用高德地图
一. vue-amap,一个基于 Vue 2.x 和高德地图的地图组件 https://elemefe.github.io/vue-amap/#/ 这个就不细说了,按照其文档,就能够安装下来. 二. ...
- MySQL之使用DDL语句创建表
一.使用DDL语句创建表 DDL语言全面数据定义语言(Data Define Language) 主要的DDL动词: CREATE(创建).DROP(删除).ALTER(修改) TRUNCATE(截断 ...
- 记事本app TOP5(个人观点)
1.为知笔记 为知笔记定位于高效率工作笔记,主打工作笔记的移动应用,是目前国内唯一一款"工作笔记"的云笔记类产品.除了常用的笔记功能保存的网页.灵感笔记.重要文档.照片.便签等,为 ...
- 支付宝app支付服务器签名代码(C#)
1,引入支付宝的sdk(AopSdk) 支付宝接口文档网站可下载,注意下载C#版本: 2,代码写的比较简单 public static string RSASign(string OrderNo,de ...
- 腾讯云更换yum源
最近公司使用了云服务器代替了机房的一些服务器,然而选择了腾讯云,个人观点通过比较还是阿里云好了点,可能为了使用腾讯云的一些其他功能吧,书归正文. 由于腾讯的源网站经常挂,在我使用过的一台腾讯云主机的时 ...