FFmpeg 音频编码(PCM数据编码成AAC android)

本文介绍了如何使用FFmpeg库在Android上进行音频编码,从录音获取PCM数据,然后将其编码成AAC格式。重点在于初始化编码器和添加ADTS头以确保AAC数据的正确播放。注意不同采样率和声道配置对编码的影响,例如8000HZ单声道和16000HZ双声道的差异。提供了包含编码和添加ADTS头的C++代码示例,并给出了录音失败时调整缓冲区大小的建议。
摘要由CSDN通过智能技术生成

之前做的直播设计到音视频编码、rtmp推流、rtmp流播放等内容,现在抽时间整理一下。首先说一下音频编码(pcm 编码得到aac数据)。

                                                                                                                                                                                     

1 录音(获取pcm数据)

开始录音

private void startRecord(){

	Log.i(TAG, "startRecord mIsRecording="+mIsRecording);
	if(!mIsRecording){
		mIsRecording = true;
		synchronized (mLock) {
			mAudioRecordGetExit = false;
		}
		//初始化ffmpeg 编码器
		mFFAacEncoderJni.start();
		//创建录音线程、开始录音
		mAudioRecordGetThread = new Thread(new AudioRecordGet());
		mAudioRecordGetThread.start();
	}
}
关闭录音

private void stoptRecord(){
	if(mIsRecording){
		synchronized (mLock) {
			mAudioRecordGetExit = true;
		}
		mIsRecording = false;
	}
}


具体录音通过使用AudioRecord
private class AudioRecordGet implements Runnable{
	private AudioRecord mAudioRecord;
	private static final boolean PCM_DUMP_DEBUG = true;
	private static final boolean AAC_DUMP_DEBUG = false;
	private int mAudioSource = MediaRecorder.AudioSource.MIC;
	//采样频率,采样频率越高,音质越好。44100 、22050、 8000、4000等
	private int mSampleRateHz = 8000;
	//MONO为单声道 ,STEREO为双声道
	private int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
	//编码格式和采样大小,pcm编码;支持的采样大小16bit和8bit,采样大小越大,信息越多,音质越好。
	private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
	//该size设置为AudioRecord.getMinBufferSize(mSampleRateHz, mChannelConfig, mAudioFormat); 编码aac时会失败。
	private int mBufferSizeInBytes = 2048;//AudioRecord.getMinBufferSize(mSampleRateHz, mChannelConfig, mAudioFormat);
	private AudioPCMData mAudioPCMData;
	public AudioRecordGet() {
		Log.i(TAG, "AudioRecordGet ");
		mAudioPCMData = new AudioPCMData(mBufferSizeInBytes);
		mAudioRecord = new AudioRecord(mAudioSource,
				mSampleRateHz, mChannelConfig, mAudioFormat, mBuffe
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值