Articles of pcm

使用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 { […]

难以将原始的PCM输出代码从Java移植到Android AudioTrack API

我试图将从Java SE播放chiptunes(NSF,SPC等)音乐文件的应用程序移植到Android。 Android API似乎缺less这个应用程序用于输出原始PCMaudio的javax多媒体类。 我在API中find的最接近的模拟是AudioTrack,所以我一直在摔跤。 但是,当我尝试通过正在运行的端口来运行我的一个示例音乐文件时,我所得到的只是静态的。 我的怀疑是这是我设置的AudioTrack,这是错误的。 我尝试了各种不同的构造函数,但最终都输出了静态的。 原始代码中的DataLine设置如下所示: AudioFormat audioFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, true ); DataLine.Info lineInfo = new DataLine.Info( SourceDataLine.class, audioFormat ); DataLine line = (SourceDataLine)AudioSystem.getLine( lineInfo ); 我现在使用的构造函数是: AudioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT ), AudioTrack.MODE_STREAM ); 我已经用常量和variablesreplace了常量和variables,所以它们尽可能简洁明了,但是我的基本问题是,当我从一种格式转到另一种格式时,是否存在明显的问题。

AudioTrack – 短arrays到字节数组使用jlayer(java mp3解码器)

我正在使用jLayer来解码MP3数据,这个调用: SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream); 这个返回解码数据的调用返回一个short []的数组。 output.getBuffer(); 当我用这个方法调用AudioTrack的write()时,它在我遍历文件的时候播放的很好: at.write(output.getBuffer(), 0, output.getBuffer().length); 但是,当我使用这个答案中的任何方法将short []数组转换为byte []数组时:声音变得扭曲和不安: at.write(output.getBuffer(), 0, output.getBuffer().length); 变为: byte[] array = ShortToByte_Twiddle_Method(output.getBuffer()); at.write(array, 0, array.length); 我做错了什么,我能做些什么来解决它? 不幸的是,我需要将pcm数据放入我正在使用的另一个第三方库的字节数组中。 该文件是22kHz,如果重要,这是如何被实例化: at = new AudioTrack(AudioManager.STREAM_MUSIC, 22050, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 10000 /* 10 second buffer */, AudioTrack.MODE_STREAM); 非常感谢你提前。 编辑:这是我现在正在实例化AudioTrackvariables。 因此,对于44kHz的文件,发送的值是44100,而对于22kHz的文件,值是22050。 at = new AudioTrack(AudioManager.STREAM_MUSIC, decoder.getOutputFrequency(), decoder.getOutputChannels() > […]

PCM到AAC转换使用mediacodec

我正在使用Android(Jelly Bean)中的媒体编解码器类将PCM格式编码为AAC。 该文件已编码,但没有音乐播放器能够播放该文件。 我无法在网上find任何工作代码或适当的文件。 这是我的代码: public void doConvert() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void… params) { try { int codecCount = MediaCodecList.getCodecCount(); for ( int i=0; i < codecCount; i++) { MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i); Logger.getLogger(MainActivity.class.getSimpleName()).log(Level.INFO, info.getName()); for ( String type : info.getSupportedTypes() ) { Logger.getLogger(MainActivity.class.getSimpleName()).log(Level.INFO, type); } } File inputFile […]

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

我正在尝试使用AudioRecord类来logging一个WAV文件。 问题是,它只提供原始的PCM数据,如果我把它写到一个文件,没有标题信息,所以它不会在任何媒体播放器中播放。 我怎样才能从这个原始数据创build一个WAV文件? 或者,还有什么其他的方式来录制声音在Android的WAV文件(或MP3)? 哦,我知道MediaRecorder可以使用,因为它不支持WAV或MP3格式。

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

我正在努力实施 AudioRecord (MIC) -> PCM -> AAC Encoder AAC -> PCM Decode -> AudioTrack?? (SPEAKER) 在Android 4.1+(API16)上使用MediaCodec 。 首先,我成功(但不能确定正确优化)实施PCM -> AAC Encoder由MediaCodec如下所示 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, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); return true; } […]