Articles of pcm

在Android上将wav编码为AAC

您可以使用MediaRecorder直接将流记录到AAC,但似乎没有办法将现有的PCM / WAV文件编码为AAC。 编码到AAC的能力本身存在于Android中,我想使用它。 是否有办法使用预先存在的音频文件?

如何将混响效果附加到AudioRecord / PCM数据并将其保存到文件?

我想录制来自麦克风的输入,附加混响效果,并将结果保存到文件中。 我的用例是一款应用程序,可让您在录制后唱出歌曲并选择不同的预设混响选项,然后保存您的演奏并将其存储在后端服务器上。 我发送到服务器的文件需要应用混响效果。 到目前为止,我已经能够使用AudioRecord录制输入,并且我可以为AudioTrack添加混响效果以听到混响效果,但我仍然坚持找出如何在嵌入混响效果的情况下保存音频。 这是我到目前为止所拥有的: private void startRecording() { final int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT); mRecorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSize); if(NoiseSuppressor.isAvailable()) { NoiseSuppressor ns = NoiseSuppressor.create(mRecorder.getAudioSessionId()); ns.setEnabled(true); } if(AcousticEchoCanceler.isAvailable()) { AcousticEchoCanceler aec = AcousticEchoCanceler.create(mRecorder.getAudioSessionId()); aec.setEnabled(true); } mPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AUDIO_FORMAT, bufferSize, AudioTrack.MODE_STREAM); PresetReverb reverb = new PresetReverb(1, mPlayer.getAudioSessionId()); […]

PCM Raw Bytes 到Android上的音频

我目前有一个字节数组forms的PCM音频。 格式是16位小端的签名。 我想将它转换为Android上的一些可播放格式,最好是版本3.2或更高版本。 有人有关于如何做到这一点的建议吗? 我做了一些研究并尝试了下面的内容,但都没有成功。 如果有人能提出更好的方法或指出我出错的地方,我们将不胜感激。 我尝试使用正确的音频设置创建AudioFormat,但Android不支持javax.sound.sampled库。 我也尝试将PCM数据写入wave文件,但是我遇到了所有必要的wav头信息。 我也尝试使用Android提供的AudioTrack类来播放PCM数据。 但是,我似乎听不到任何声音。 这是我的方法: public void playback(){ try{ AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 500000, AudioTrack.MODE_STATIC); audioTrack.write(audio, 0, 500000); } catch(Throwable t){ Log.d(“Audio”,”Playback Failed”); } } 任何建议,将不胜感激。

PCM – > AAC(编码器) – > PCM(解码器)实时正确优化

我正在努力实施 AudioRecord (MIC) -> PCM -> AAC Encoder AAC -> PCM Decode -> AudioTrack?? (SPEAKER) 使用Android 4.1+(API16)上的MediaCodec 。 首先,我成功(但不确定正确优化)实现了PCM -> AAC Encoder MediaCodec PCM -> AAC Encoder ,如下所示 private boolean setEncoder(int rate) { encoder = MediaCodec.createEncoderByType(“audio/mp4a-latm”); MediaFormat format = new MediaFormat(); format.setString(MediaFormat.KEY_MIME, “audio/mp4a-latm”); format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1); format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE); encoder.configure(format, […]

使用Android SDK从原始PCM数据创建WAV文件

我正在尝试使用AudioRecord类来记录WAV文件。 问题是它只提供原始PCM数据,如果我将其写入文件,则没有标题信息,因此它不会在任何媒体播放器中播放。 如何从这些原始数据创建WAV文件? 或者,有没有其他方法将Android中的声音录制到WAV文件(或者MP3)? 哦,我知道MediaRecorder可以使用,因为它不支持WAV或MP3格式。

使用mediacodec进行PCM到AAC的转换

我在Android(Jelly Bean)中使用媒体编解码器类将PCM格式编码为AAC。 该文件已编码,但没有音乐播放器能够播放该文件。 我无法在网上find任何工作代码或适当的文档。 这是我的代码: public void doConvert() { new AsyncTask() { @Override protected Void doInBackground(Void… params) { try { int codecCount = MediaCodecList.getCodecCount(); for ( int i=0; i = 0 ) { ByteBuffer inBuf = inputBuffers[nextBuffer]; inBuf.clear(); int bytesRead = fis.read( readBuffer,0, inBuf.capacity() ); Log.e(“bytesread”,”Read = “+bytesRead); if ( bytesRead -1 ) //{ outputBuffer[outputBufferIndex].position(outBuffInfo.offset); […]

PCM音频幅度值?

我开始使用我的Android智能手机进行录音。 我成功地将录音保存到PCM文件中。 当我解析数据并打印出带符号的16位值时,我可以创建如下图所示的图形。 但是,我不了解沿y轴的振幅值。 振幅值的单位究竟是多少? 这些值是16位的,因此它们必须在-32K到+ 32K之间。 但这些价值代表什么呢? 分贝? 如果我使用8位值,则值必须在-128到+128之间。 如何将其映射到16位值的音量/“响度”? 您是否只使用16对1量化映射? 为什么会出现负值? 我认为完全沉默会导致值为0。 如果有人可以将我指向一个网站,其中包含有关正在录制内容的信息,我将不胜感激。 我发现PCM文件格式的网页 ,但不是数据值。

如何从fft结果获得频率?

我在我的Android手机上录制了麦克风数据[1024],通过实际数据的1D前向DFT(再设置1024位为0)。 我将数组保存到文本文件中,并重复了8次。 我收到了16384的结果。 我在Excel中打开了文本文件并制作了一个图表以查看它的外观(x =数组索引,y =返回的数字大小)。 有大量的尖峰(正面和负面)在110,232左右,并且小尖峰继续以这种方式持续到1817年和1941年,尖峰再次变大,然后再次下降。 我的问题是,无论我在哪个主题上寻求帮助,它都会提到实数和虚数,我只有一维数组,我从Piotr Wendykier的类中使用的方法得到了回复: DoubleFFT_1D.realForwardFull(audioDataArray); // from the library JTransforms. 我的问题是:我需要对此数据做什么才能返回频率? 录制的声音是我在吉他的底弦(第五音品)上演奏’A’(大约440Hz)。

解码audio文件并重新编码为所需的PCM格式:44,100 kHz,2个通道,16位

我想将audio文件解码为原始PCM数据,将其stream式传输到本地networking中的播放设备。 我使用了API级别为16的新MediaExtractor和MediaCodec类。 该设备要求PCM数据在44100kHz,具有2个通道和16位样本大小 。 只要input文件大致符合这些要求,这工作正常。 但是,无论何时我正在解码一个MP3文件,例如,使用32,000 kHz的采样率,也许只有一个通道,那么我不会从MediaCodec类获得所需的输出。 看来我不能指定MediaCodec类的输出格式 。 所以我决定实例化另一个MediaCodec对象,将原始数据重新编码成我想要的格式。 根据Android 4.1 支持的媒体格式列表,Android支持编码PCM / Wave。 但是, 我无法创build一个MediaCodec对象,编码PCM / Wave 。 我试着将各种MIMEtypes传递给MediaCodec.createEncoderByType(type); 但是我总是以IOExceptionexception失败: java.io.IOException: Failed to allocate component instance at android.media.MediaCodec.native_setup(Native Method) at android.media.MediaCodec.<init>(MediaCodec.java:210) at android.media.MediaCodec.createEncoderByType(MediaCodec.java:194) [..] 有没有人能够成功地创build一个MediaCodec实例,编码为PCM / Wave,并可以提供一个工作的例子?

发出编码和解码audiologging为G711(PCMU – uLaw)格式

当我们需要stream式传输audio时,没有太多有关应用此编解码器的信息。 没有应用编解码器,我的代码就像一个build立2设备之间的通信魅力工作,但我需要在该格式的编码/解码,因为我需要stream服务器,而不是两个设备之间(我正在testing这个代码使用2设备)。 我正在寻找机会,如果你的任何人都可以看到我的问题的关键在哪里。 我已经尝试了input参数的不同configuration。 也许,我使用的编解码器是错误的(我使用Apache许可证从一个项目中获得了它们)。 这个值在播放器 – 接收器设备中设置在录音机 – 发送器中: private int port=50005; private int sampleRate = 8000 ;//44100; private int channelConfig = AudioFormat.CHANNEL_OUT_MONO; private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int minBufSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat); 注意:播放器中的CHANNEL_OUT_MONO和logging器项目中的CHANNEL_IN_MONO。 这些是我的方法: public void startStreamingEncoding() { Thread streamThread = new Thread(new Runnable() { @Override public void run() { try { […]