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 could
1050        // cause out-of-memory due to large input buffer size. And audio recording
1051        // probably doesn't make sense in the scenario, since the slow-down factor
1052        // 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 overlap
1955        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 buffer
122    mReadBuffers.push_back(mbuf);
123}
124
125bool MediaCodecSource::Puller::Queue::readBuffer(MediaBuffer **mbuf) {pop buffer
126    if (mReadBuffers.empty()) {
127        *mbuf = NULL;
128        return false;
129    }
130    *mbuf = *mReadBuffers.begin();
131    mReadBuffers.erase(mReadBuffers.begin());
132    return true;
133}
134
135void MediaCodecSource::Puller::Queue::flush() {清空buffer
136    MediaBuffer *mbuf;

需要在这里打印 mReadBuffers.size(),就知道audio Encoder性能不够


137    while (readBuffer(&mbuf)) {
138        // there are no null buffers in the queue
139        mbuf->release();
140    }
141}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值