Google Time Lapse Recording 在高档手机上的一个实现
实现的配置是 mCaptureFp=240 mFrameRate=30
设置的SampleRate=48K,计算得到的sampleRate为384K
1047 if (mCaptureFpsEnable && mCaptureFps >= mFrameRate) {1048 // Upscale the sample rate for slow motion recording.1049 // Fail audio source creation if source sample rate is too high, as it could1050 // cause out-of-memory due to large input buffer size. And audio recording1051 // probably doesn't make sense in the scenario, since the slow-down factor1052 // is probably huge (eg. mSampleRate=48K, mCaptureFps=240, mFrameRate=1).1053 const static int32_t SAMPLE_RATE_HZ_MAX = 192000;1054 sourceSampleRate =1055 (mSampleRate * mCaptureFps + mFrameRate / 2) / mFrameRate;1056 if (sourceSampleRate < mSampleRate || sourceSampleRate > SAMPLE_RATE_HZ_MAX) {1057 ALOGE("source sample rate out of range! "1058 "(mSampleRate %d, mCaptureFps %.2f, mFrameRate %d",1059 mSampleRate, mCaptureFps, mFrameRate);1060 return NULL;1061 }1062 }
1064 sp<AudioSource> audioSource =1065 new AudioSource(1066 mAudioSource,1067 mOpPackageName,1068 sourceSampleRate,//AudioRecord使用这个值来设置采样率1069 mAudioChannels,1070 mSampleRate,1071 mClientUid,1072 mClientPid);
如果需要有Pause/Resume功能的话,这里代码可能需要修改
1954 // 30 ms buffer to avoid timestamp overlap1955 mTotalPausedDurationUs += resumeStartTimeUs - mPauseStartTimeUs - 30000;1956 }1957 double timeOffset = -mTotalPausedDurationUs;1958 if (mCaptureFpsEnable) {1959 timeOffset *= mCaptureFps / mFrameRate;1960 }
[测试中出现的问题]
在240FPS的Video状态下,系统忙(CPU占用90%以上)
导致:Audio PCM数据在编码前的queue中堆积
可以查看的方法如下:
121void MediaCodecSource::Puller::Queue::pushBuffer(MediaBuffer *mbuf) {push buffer122 mReadBuffers.push_back(mbuf);123}124125bool MediaCodecSource::Puller::Queue::readBuffer(MediaBuffer **mbuf) {pop buffer126 if (mReadBuffers.empty()) {127 *mbuf = NULL;128 return false;129 }130 *mbuf = *mReadBuffers.begin();131 mReadBuffers.erase(mReadBuffers.begin());132 return true;133}134135void MediaCodecSource::Puller::Queue::flush() {清空buffer136 MediaBuffer *mbuf;
需要在这里打印 mReadBuffers.size(),就知道audio Encoder性能不够
137 while (readBuffer(&mbuf)) {138 // there are no null buffers in the queue139 mbuf->release();140 }141}
阅读更多
- 这个开源项目展示了如何实现一个横跨各种Android平台的音乐播放器,包括手机,平板,汽车,手表,电视等。Google官方推出,跨平台开发必看项目。
- 学GOOGLE的一个特酷的效果实现的源码
- 利用HTML5的一个重要特性 —— DeviceOrientation来实现手机网站上的摇一摇功能
- java实现的一个发送手机短信
- java实现的一个发送手机短信
- 关于一个 date-time 时间服务的daemon process 的代码实现
- 实现一个基于串口的手机AT信令模拟器
- 一个实现综合网管系统手机客户端的方案
- 绑定手机号功能,注册后在个人中心有一个绑定手机号的菜单,输入手机号码,手机接收短信验证码(有效期5分钟),,简述实现思路。
- android开发通过基站手机网络实现定位功能(Google实现)
- 解决国行安卓(Android)手机无谷歌(Google)服务的一个参考方法
- 微软,Google面试题 (18) —— 用两个栈实现一个队列
- Android下实现一个手机监控摄像头
- 利用java实现的一个发送手机短信的小例子
- 利用java实现的一个发送手机短信的小例子
- 怎样用笔记本的无线网卡做一个AP 实现笔记本做wifi热点供手机、平板电脑wifi上网而不用无线路由器
- 手机浏览器下载的m3u8格式的多个视频文件合并成一个视频(Java实现)
- 利用java实现的一个发送手机短信的小例子
- 【JAVA基础】0013--------java实现的一个发送手机短信的小例子
- 最近做一个安卓的手机APP项目涉及到手机号注册登录,怎么实现