小编Jes*_*don的帖子

Android-dev AudioRecord没有阻塞或线程

我希望录制麦克风音频流,以便我可以在其上进行实时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)

android-audiomanager android-audiorecord

7
推荐指数
1
解决办法
3076
查看次数

2013年HTML5视频的当前状态

我一直在我的网站上使用Flash视频嵌入视频.我的旧2.2.x安卓很好,但我注意到很多新的Android设备以及苹果设备不会播放我的视频因为flashplayer褪色,所以我正在研究解决方案 - 而HTML5视频似乎是新的东西.

我只花了2个小时搜索谷歌并阅读了很多东西,但大部分时间是从1年,2年或3年前开始 - 从我读过的内容来看,看起来使用html5视频标签仍然需要每个视频转换为多种格式,全屏是某种特定于供应商的扩展 - 在每个浏览器上都有不同的支持它.

所以我的问题是,HTML5视频标签现在是否完全替代了Flash播放器,还是仍然是一个需要浏览器特定黑客攻击的六个最流行的浏览器 - 在2013年?

它适用于PC,Mac,机器人和iPhone吗?

video html5 html5-video

6
推荐指数
1
解决办法
1052
查看次数