下表中是outputFormat类中 的调用字段 和它代表的格式对应表
调用字段AAC_ADTSAMR_NB DEFAULTMPEG_2_TSMPEG_4THREE_GPPWEBM格式.aac .3gp .ts.mp4.3gp.ogg格式 .m4a mkv
① 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,ts (not seekable,Android 3.0+),aac
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_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
VORBIS Ogg Vorbis音频编解码器。 Ogg Vorbis是一种新的音频压缩格式,类似于MP3等现有的音乐格式。 它是完全免费、开放和没有专利限制的。 支持多声道。 更低的码率和文件体积。 Ogg Vorbis文件的扩展名是.ogg。 现在创建的OGG文件可以在未来的任何播放器上播放,因此,这种文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。 支持的文件类型/容器格式 •Ogg .ogg •Matroska .mkv (Android 4.0+) Matroska是一种新的多媒体封装格式,它可将多种不同编码的视频及16条以上不同格式的音频和不同语言的字幕流封装到一个Matroska Media文件当中。也是其中一种开放源代码的多媒体封装格式。
AAC音频编码标准支持采样率范围8至96KHZ
AMRNB音频编码标准支持采样率范围8KHZ
AMRWB音频编码标准支持采样率范围16KHZ
常用的采样率有:
8,000 Hz - 电话所用采样率,对于人的说话已经足够11,025 Hz22,050 Hz - 无线电广播所用采样率32,000 Hz - miniDV数码视频camcorder、DAT(LP mode)所用采样率44,100 Hz - 音频CD,也常用于MPEG-1音频(VCD, SVCD, MP3)所用采样率47,250 Hz - Nippon Columbia(Denon)开发的世界上第一个商用PCM录音机所用采样率48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率50,000 Hz - 二十世纪七十年代后期出现的3M和Soundstream开发的第一款商用数字录音机所用采样率50,400 Hz - 三菱X-80数字录音机所用所用采样率96,000或者192,000 Hz - DVD-Audio、一些LPCM DVD音轨、Blu-ray Disc(藍光碟)音轨、和HD-DVD(高清晰度DVD)音轨所用所用采样率2.8224 MHz - SACD、索尼和飞利浦联合开发的称为Direct Stream Digital的1位sigma-delta modulation过程所用采样率。总结:通过以上整理,我们在使用MediaRecord的时候,就不会盲目去设置AudioEncoder,OutputFormat和AudioSamplingRate了,而是根据实际情况来使用。
(二)我遇到的问题如下:
这个类是保存摄像机配置信息的一个实体类,准确说是保存音视频配置信息,因此创建实例过程如下;
我使用的视频质量是CamcorderProfile.QUALITY_1080P 对应size 大小是6 int size = CamcorderProfile.QUALITY_1080P; //通过传入相机id 和视频质量来获取其实例对象 CamcorderProfile mProfile = CamcorderProfile.get(cameraId, size);当我们对mediaRecorder 录制视频进行一些初始配置时用到了setProfile(CamcorderProfile profile);然后在某些手机上出现了音视频不同步的问题
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mProfile.videoBitRate = videoBitRate; mProfile.audioBitRate = audioBitRate; mMediaRecorder.setProfile(mProfile); mMediaRecorder.setCaptureRate(30); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoEncodingBitRate(videoBitRate); mMediaRecorder.setAudioEncodingBitRate(audioBitRate);通过查看这个方法源代码:
public void setProfile(CamcorderProfile profile) { setOutputFormat(profile.fileFormat); setVideoFrameRate(profile.videoFrameRate); setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); setVideoEncodingBitRate(profile.videoBitRate); setVideoEncoder(profile.videoCodec); if (profile.quality >= CamcorderProfile.QUALITY_TIME_LAPSE_LOW && profile.quality <= CamcorderProfile.QUALITY_TIME_LAPSE_QVGA) { // Nothing needs to be done. Call to setCaptureRate() enables // time lapse video recording. } else { setAudioEncodingBitRate(profile.audioBitRate); setAudioChannels(profile.audioChannels); setAudioSamplingRate(profile.audioSampleRate); setAudioEncoder(profile.audioCodec); } }经过分析:当上面代码走到判断条件时走到了else 打印查看 profile.quality =6 ,也就是我们创建CamcorderProfile 实例时传入的那个size 6 ,他与运行时质量(查看源码都是1000以上的数)进行比较时永远是小的, 因此走到了else 对音频进行一些设置。
因此我们看一下音频设置这几行代码有没有问题将这几个方法重写到自己使用类打印输出如下:
// 打印我们profile 中的这些值如下, 我们采用一行行注释执行找到设置采样率时出现了音频不 //同步 Log.d(TAG, "video bit rate: " + mProfile.videoBitRate); Log.d(TAG, "video frame rate: " + mProfile.videoFrameRate); Log.d(TAG, "audio bit rate: " + mProfile.audioBitRate); Log.d(TAG, "audio channels: " + mProfile.audioChannels); Log.d(TAG, "audio sampling rate: " + mProfile.audioSampleRate); 通过查看音频解码器使用的是AAC mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //编码率使用的128000 设置这个音频的编码率不会影响音视频不同步 ; // mMediaRecorder.setAudioEncodingBitRate(128000); // 音频频道使用为2 设置音频频道为2也不会影响音视频不同步问题; // mMediaRecorder.setAudioChannels(2); // AAC音频编码标准支持的采样率范围为8至96KHz //这里log打印设置的是48000 出现了不 //同步的问题 mMediaRecorder.setAudioSamplingRate(48000);通过上面我们找到原因, 设置音频采样率的时候出现了不同步现象;通过知识储备, 我们知道我们设置的编码格式AAC它的音频采样率取值范围为8至96KHz 。 这里设置48000 按道理来说是可以满足的 ,48000采样率是 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率,结果它在某些设备上出现了音视频不同步现象。如果不设置此参数 默认应该是 8000 Hz 是 电话所用采样率,对于人的说话已经足够。结果在我的所有设备上没有出现音视频不同步现象 因此当我们不设置时默认是8000 Hz 这样就没有出现声音和视频不同步现象,因此保守起见在设置音频采样率时 设置成常用的8,000 Hz;