Articles of pcm

解码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; } […]

PCM原始字节到Android上的audio

我目前有一个字节数组forms的PCMaudio。 格式有16位小尾数。 我想将其转换为Android上的某些可播放格式,最好是3.2或更高版本。 有没有人有如何做到这一点的build议? 我已经做了一些研究,并尝试了下面的内容,但都没有成功。 如果有人能提出一个更好的方法或指出我出错的地方,我们将不胜感激。 我曾尝试使用正确的audio设置创buildAudioFormat,但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"); } } 任何build议,将不胜感激。

PCMaudio幅度值?

我开始用我的Android智能手机录音。 我成功将录音保存到PCM文件。 当我parsing数据并打印出有符号的16位值时,我可以创build一个如下所示的graphics。 但是,我不明白沿y轴的幅度值。 振幅值的单位究竟是什么? 这些值是有符号的16位,所以它们的范围必须是-32K到+32K。 但是这些价值观代表什么? 分贝? 如果我使用8位值,那么值必须在-128到+128之间。 这将如何映射到16位值的音量/“响度”? 你会使用一个16比1的量化映射吗? 为什么有负面的价值? 我会认为完全沉默会导致0的值。 如果有人可以指向我的网站,有关正在录制的信息,我将不胜感激。 我发现PCM文件格式的网页 ,但不是什么数据值。

将PCM录制的数据写入.wav文件(java android)

我正在使用AudioRecord在Android中logging16位PCM数据。 在logging数据并将其保存到文件后,我将其读回并保存为.wav文件。 问题是WAV文件被媒体播放器所识别,但是除了纯粹的噪音之外,什么都不播放。 我现在最好的猜测是我的wav文件头是不正确的,但我一直无法看到究竟是什么问题。 (我想这是因为我可以播放我在Audacity录制的原始PCM数据) 这是我的代码读取原始PCM文件并将其保存为.wav: private void properWAV(File fileToConvert, float newRecordingID){ try { long mySubChunk1Size = 16; int myBitsPerSample= 16; int myFormat = 1; long myChannels = 1; long mySampleRate = 22100; long myByteRate = mySampleRate * myChannels * myBitsPerSample/8; int myBlockAlign = (int) (myChannels * myBitsPerSample/8); byte[] clipData = getBytesFromFile(fileToConvert); long myDataSize = […]