audioFormat;// 文件格式 SourceDataLine sourceDataLine;// 输出设备 // 播放 private void play() { = audioInputStream.getFormat(); // 转换mp3文件编码 if (audioFormat.getEncoding() ! = AudioFormat.Encoding.PCM_SIGNED) { audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED , audioFormat.getSampleRate(), 16, audioFormat .getChannels(), audioFormat.getChannels() * 2, audioFormat.getSampleRate(), false
, AudioFormat.ENCODING_PCM_8BIT); recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100 , AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT, bufferSize); recorder.startRecording audioFormat = new AudioFormat.Builder().setEncoding(AudioFormat.ENCODING_PCM_8BIT).setSampleRate(44100 (44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT); tracker = new AudioTrack (audioAttributes, audioFormat, bufferSize, AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE
, AudioFormat.ENCODING_PCM_16BIT) * 2; ② 创建 AudioRecord 对象 : AudioRecord 构造函数需要传入 音频来源 , 采样率 , 声道配置 , / 立体声 AudioFormat.CHANNEL_IN_STEREO ; ④ int audioFormat 参数 : 采样位数, 8 位 AudioFormat.ENCODING_PCM_8BIT / 16 , AudioFormat.ENCODING_PCM_16BIT ; ⑤ int bufferSizeInBytes 参数 : 每次采集数据的最大缓冲区大小 ; 2 . , AudioFormat.ENCODING_PCM_16BIT) * 2; /* public AudioRecord(int audioSource, int / 立体声 AudioFormat.CHANNEL_IN_STEREO, int audioFormat 参数 : 采样位数, 8 位 AudioFormat.ENCODING_PCM
23 : 21); if (Build.VERSION.SDK_INT < minSDKVersion) { audioFormat = AudioFormat.ENCODING_PCM _16BIT; } } switch (audioFormat) { case AudioFormat.ENCODING_PCM ", getting ENCODING_PCM_16BIT"); audioFormat = AudioFormat.ENCODING_PCM_16BIT; = AudioFormat.CHANNEL_OUT_QUAD | AudioFormat.CHANNEL_OUT_FRONT_CENTER; break; case 7: channelConfig = AudioFormat.CHANNEL_OUT_5POINT1 | AudioFormat.CHANNEL_OUT_BACK_CENTER
, AudioFormat.ENCODING_PCM_16BIT); if(minBufferSize < buffer.capacity()){ minBufferSize = buffer.capacity () .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(48000) .setChannelMask( AudioFormat.CHANNEL_IN_STEREO) .build()) .setBufferSizeInBytes(bufferSizeInBytes) .build() channelConfig 描述音频通道的配置,一般配置单通道(AudioFormat.CHANNEL_IN_MONO) 和双声道 (AudioFormat.CHANNEL_IN_STEROR)。 audioFormat 音频格式,这里表示采集音频数据的精度,参数可选:AudioFormat.ENCODING_PCM_8BIT,AudioFormat.ENCODING_PCM_16BIT,AudioFormat.ENCODING_PCM_FLOAT
#CHANNEL_OUT_MONO 单声道 * @link AudioFormat#CHANNEL_OUT_STEREO 双声道 * @param audioFormat * @link AudioFormat#ENCODING_PCM_16BIT, * @link AudioFormat#ENCODING_PCM_8BIT, * @link AudioFormat#ENCODING_PCM_FLOAT 计算最小缓冲区大小 /** * @param sampleRateInHz 采样频率 * @param channelConfig 声道数 * @param audioFormat 位宽. */ AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO; int audioFormat = AudioFormat.ENCODING_PCM AudioFormat.ENCODING_PCM_8BIT : AudioFormat.ENCODING_PCM_16BIT; mBufferSize = AudioTrack.getMinBufferSize
= 44100.00; audioFormat.mFormatID = kAudioFormatLinearPCM; audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; audioFormat.mFramesPerPacket = 1; audioFormat.mChannelsPerFrame = 1; audioFormat.mBitsPerChannel = 16; audioFormat.mBytesPerPacket , sizeof(audioFormat)); checkStatus(status); status = AudioUnitSetProperty , sizeof(audioFormat)); checkStatus(status); // 设置数据采集回调函数 AURenderCallbackStruct
* See {@link AudioFormat#CHANNEL_IN_MONO} and * {@link AudioFormat#CHANNEL_IN_STEREO}. * @param audioFormat the format in which the audio data is to be returned. * See {@link AudioFormat#ENCODING_PCM_8BIT}, {@link AudioFormat#ENCODING_PCM_16BIT}, * and {@link AudioFormat#ENCODING_PCM_FLOAT} = AudioFormat.ENCODING_PCM_16BIT; // stereo 立体声, int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_STEREO
AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO; int audioFormat = AudioFormat.ENCODING_PCM _16BIT; if (outputFormat.containsKey("bit-width")) audioFormat = outputFormat.getInteger AudioFormat.ENCODING_PCM_8BIT : AudioFormat.ENCODING_PCM_16BIT; mBufferSize = AudioTrack.getMinBufferSize (sampleRate, channelConfig, audioFormat) * 2; mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC ,sampleRate,channelConfig,audioFormat,mBufferSize,AudioTrack.MODE_STREAM); mAudioTrack.play
(4). audioFormat指定采样PCM数据的采样格式,预设值定义在也AudioFormat中,常用值有: ENCODING_PCM_8BIT、ENCODING_PCM_16BIT和ENCODING_PCM_FLOAT AudioFormat.SAMPLE_RATE_UNSPECIFIED 可以自动根据选定的音频源设置频率。AUDIO_SAMPLE_RATE = 16000。 (3). ChannelConfig:声道设置 AudioFormat.CHANNEL_IN_MONO单声道,常量为AUDIO_CHANNEL =AudioFormat.CHANNEL_IN_MONO。 audioFormat:音频格式 AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT, andAudioFormat.ENCODING_PCM_FLOAT public static int getMinBufferSize (int sampleRateInHz, intchannelConfig, int audioFormat) 四、录音编码 1、编码格式
import cn.juwatech.audio.AudioFile;import cn.juwatech.audio.AudioConcatenator;import cn.juwatech.audio.AudioFormat import cn.juwatech.audio.AudioConcatenator;import cn.juwatech.audio.AudioFile;import cn.juwatech.audio.AudioFormat path_to_audio_file_3.wav"; // 创建音频文件对象 AudioFile audioFile1 = new AudioFile(new File(audioFilePath1), AudioFormat.WAV ); AudioFile audioFile2 = new AudioFile(new File(audioFilePath2), AudioFormat.WAV); AudioFile audioFile3 = new AudioFile(new File(audioFilePath3), AudioFormat.WAV); // 将音频文件添加到列表中
try { mAudioEncodec = MediaCodec.createEncoderByType(mineType); MediaFormat audioFormat ); audioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 4096); mAudioEncodec.configure (audioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mAudioBuffInfo = new MediaCodec.BufferInfo MediaFormat audioFormat = new MediaFormat(...); MediaFormat videoFormat = new MediaFormat(...); int audioTrackIndex = muxer.addTrack(audioFormat); int videoTrackIndex = muxer.addTrack(
AudioFormat负责音频参数配置,比如采样率,声道,精度等。 接下来就是buffer大小,buffer大小可以通过getMinBufferSize获取到。 ; case AudioFormat.CHANNEL_OUT_STEREO: case AudioFormat.CHANNEL_CONFIGURATION_STEREO: AudioFormat.isPublicEncoding(audioFormat)) { loge("getMinBufferSize(): Invalid audio format | AudioFormat.CHANNEL_OUT_FRONT_RIGHT; } int encoding = AudioFormat.ENCODING_DEFAULT ; if ((format.getPropertySetMask() & AudioFormat.AUDIO_FORMAT_HAS_PROPERTY_ENCODING) !
public class EngineeCore { String filePath = "E:\\voice\\voice_cache.wav"; AudioFormat audioFormat flag = false; targetDataLine.stop(); targetDataLine.close(); } private AudioFormat ; // true,false boolean bigEndian = false; // true,false return new AudioFormat getAudioFormat(); DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat , audioData.length / audioFormat.getFrameSize()); //定义最终保存的文件名 System.out.println
,方法很简单,在native层调用java代码 首先在java中定义相应的方法: package com.aruba.ffmpegapplication; import android.media.AudioFormat */ private void create(int sampleRateInHz, int channelCount) { int channelConfig = AudioFormat.CHANNEL_OUT_MONO ; //单声道 if (channelCount == 2) { channelConfig = AudioFormat.CHANNEL_OUT_STEREO; } int buffSize = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM / @Deprecated // public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat
Android 高性能音频】Oboe 开发流程 ( Oboe 完整代码示例 ) 博客中的 Oboe 音频流创建时 的代码 , 设置 Oboe 音频流 的参数如下 ; 设置的 采样格式 是 oboe::AudioFormat builder.setSharingMode(oboe::SharingMode::Exclusive); // 设置音频采样格式 builder.setFormat(oboe::AudioFormat 设置回调对象 , 注意要设置 AudioStreamCallback * 指针类型 builder.setCallback(&myCallback); 如果设置的 采样格式 是 oboe::AudioFormat 中 , 实现的 onAudioReady 方法 , 其中的 int32_t numFrames 就是本次需要采样的帧数 , 注意单位是音频帧 , 这里的音频帧就是上面所说的 采样格式 是 oboe::AudioFormat onAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames) { // 需要生成 AudioFormat
场景示例: AudioFormat format = new AudioFormat(44100, 16, 2, true, true); DataLine.Info info = new DataLine.Info 三、错误代码示例 为了更好地理解该问题,下面提供一个典型的错误代码示例: public void playAudio() { AudioFormat format = new AudioFormat 改进后的代码示例: public void playAudio() { AudioFormat format = new AudioFormat(44100, 16, 2, true, true
源码介绍 public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, : // AudioFormat.CHANNEL_CONFIGURATION_DEFAULT case AudioFormat.CHANNEL_IN_MONO: case AudioFormat.CHANNEL_IN_STEREO: case AudioFormat.CHANNEL_CONFIGURATION_STEREO: case ( AudioFormat.CHANNEL_IN_FRONT | AudioFormat.CHANNEL_IN_BACK): channelCount = 2; ((format.getPropertySetMask() & AudioFormat.AUDIO_FORMAT_HAS_PROPERTY_ENCODING) !
import org.json.JSONObject; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat File mp3 = new File(mp3filepath); AudioInputStream audioInputStream = null; AudioFormat MpegAudioFileReader mp = new MpegAudioFileReader(); in = mp.getAudioInputStream(mp3); AudioFormat baseFormat = in.getFormat(); targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED
ENCODING_PCM_16BIT // 计算最小buffer size val bufferSize = AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_OUT_STEREO , AudioFormat.ENCODING_PCM_16BIT ) // 创建AudioTrack实例 mAudioTrack = AudioTrack( AudioAttributes.Builder ().setLegacyStreamType(AudioManager.STREAM_MUSIC).build(), AudioFormat.Builder(). setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) .setEncoding(AudioFormat.ENCODING_PCM_16BIT) swr_alloc_set_opts( nullptr, AV_CH_LAYOUT_STEREO, // 双声道 AV_SAMPLE_FMT_S16, // 对应到AudioTrack的AudioFormat.ENCODING_PCM