我希望录制麦克风音频流,以便我可以在其上进行实时DSP.
我希望这样做而不必使用线程,并且.read()
在等待新的音频数据时没有阻塞.
更新/答案:这是Android中的一个错误.4.2.2仍有问题,但5.01已经固定!我不确定分歧在哪里,但这就是故事.
注意:请不要说"只使用线程".线程很好,但这不是关于它们的,Android开发人员打算让AudioRecord完全可用,而不必指定线程,也不必处理阻塞read().谢谢!
这是我发现的:
初始化AudioRecord对象时,它会创建自己的内部环型缓冲区.当.start()
被调用时,它开始记录到所述环形缓冲区(或者它实际上是什么类型).
当.read()
被调用时,它读取缓冲区大小的任一半或指定的字节数(取较小),然后返回.
如果内部缓冲区中有足够多的音频样本,则read()会立即返回数据.如果还不够,则read()等待直到有,然后返回数据.
.setRecordPositionUpdateListener()
可用于设定的监听器,并且.setPositionNotificationPeriod()
和.setNotificationMarkerPosition()
可用于设置通知周期和位置,分别.
但是,除非满足某些要求,否则似乎永远不会调用Listener:
1:Period或Position必须等于bufferSize/2或(bufferSize/2)-1.
2:.read()
必须在Period或Position计时器开始计数之前调用A - 换句话说,在调用.start()
之后也调用.read()
,并且每次调用Listener时,.read()
再次调用.
3:.read()
每次必须至少读取一半bufferSize.
因此,使用这些规则,我能够使回调/监听器工作,但由于某种原因,读取仍然是阻塞的,我无法弄清楚如何只有在有完整的读取值时才调用监听器.
如果我设置一个按钮视图点击阅读,那么我可以点击它,如果快速点击,读取块.但是,如果我等待音频缓冲区填充,那么第一次点击是即时的(读取立即返回),但是由于read()必须等待,我猜测是否会暂停快速点击.
非常感谢有关如何使Listener按预期工作的任何见解 - 以这样一种方式,当有足够的read()数据立即返回时,我的监听器被调用.
下面是我的代码的相关部分.
我的代码中有一些日志语句,它们向logcat发送字符串,这使我可以看到每个命令的执行时间,这就是我知道read()是阻塞的.(而且我的简单测试应用程序中的按钮在重复读取时响应非常慢,但CPU没有挂钩.)
谢谢,〜杰西
在我的OnCreate()中:
bufferSize=AudioRecord.getMinBufferSize(samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT)*4;
recorder = new AudioRecord (AudioSource.MIC,samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,bufferSize);
recorder.setRecordPositionUpdateListener(mRecordListener);
recorder.setPositionNotificationPeriod(bufferSize/2);
//recorder.setNotificationMarkerPosition(bufferSize/2);
audioData = new short [bufferSize];
recorder.startRecording();
samplesread=recorder.read(audioData,0,bufferSize);//This triggers it to start doing the callback.
Run Code Online (Sandbox Code Playgroud)
那么这是我的倾听者:
public OnRecordPositionUpdateListener mRecordListener = new OnRecordPositionUpdateListener()
{
public void onPeriodicNotification(AudioRecord recorder) …
Run Code Online (Sandbox Code Playgroud) 我一直在我的网站上使用Flash视频嵌入视频.我的旧2.2.x安卓很好,但我注意到很多新的Android设备以及苹果设备不会播放我的视频因为flashplayer褪色,所以我正在研究解决方案 - 而HTML5视频似乎是新的东西.
我只花了2个小时搜索谷歌并阅读了很多东西,但大部分时间是从1年,2年或3年前开始 - 从我读过的内容来看,看起来使用html5视频标签仍然需要每个视频转换为多种格式,全屏是某种特定于供应商的扩展 - 在每个浏览器上都有不同的支持它.
所以我的问题是,HTML5视频标签现在是否完全替代了Flash播放器,还是仍然是一个需要浏览器特定黑客攻击的六个最流行的浏览器 - 在2013年?
它适用于PC,Mac,机器人和iPhone吗?