AndroidのC ++録音オーディオPCMファイル

一般的なPCM記録ファイル、単に除去パッケージtinycap wavファイルは、直接PCMファイル(ヘッダ+原理WAV = PCMデータ)を記録することができるtinycapコードを変更。また、AndroidのC ++はAudioSourceレコードのクラスを使用することができます。次のようにコードは、非常に簡単です:

#include <binder/ProcessState.h>
#include <media/mediarecorder.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/AudioSource.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
#include <system/audio.h>

#define LOG_TAG "recordAudio"

using namespace android;

int main() {
    static const int32_t kSampleRate = 16000;
    static const int32_t kNumChannels = 1;
    static const int32_t kRecordTime = 20;  //20 seconds
    android::ProcessState::self()->startThreadPool();

    FILE *fp = fopen("/data/misc/media/audio.pcm","wb");
    if (fp == NULL) {
        return 0;
    }

    sp<AudioSource> audioSource = new AudioSource(
            AUDIO_SOURCE_CAMCORDER,  /*main mic: AUDIO_SOURCE_DEFAULT*/
            kSampleRate /* sampleRate */,
            kNumChannels /* channelCount */);

    status_t err = audioSource->initCheck();
    if (err != OK) {
        ALOGE("audio source is not initialized, initCheck failed");
        return 0;
    } else {
        sp<MetaData> params = new MetaData;
        params->setInt64(kKeyTime, 0ll);
        err = audioSource->start(params.get());
    }

    int64_t start_record = systemTime();
    while (1) {
        MediaBuffer *mbuf;
        err = audioSource->read(&mbuf);
        if (err != OK) {
            ALOGE("read audio data failed, err: %d", err);
            break;
        } else {
            int64_t timeUs;
            mbuf->meta_data()->findInt64(kKeyTime, &timeUs);
            ALOGD("audio frame timeUs: %lld", timeUs);
            fwrite((const uint8_t *)mbuf->data() + mbuf->range_offset(), 1, mbuf->range_length(), fp);
            mbuf->release();
            mbuf = NULL;
        }
        int64_t record_time = ((systemTime() - start_record) / 1000000000L);
        if (record_time > kRecordTime) {  //record 20 seconds
            ALOGE("record audio completed");
            break;
        }
    }

    audioSource->stop();
    audioSource.clear();
    fclose(fp);

    return 0;
}

コードがコンパイルされるべき\ AV \ CMDS \ stagefright \ディレクトリフレームワークに配置することができます。framwork \ ... \ AudioSource.cppファイルを参照してくださいしたいとはAudioSource。

公開された30元の記事 ウォン称賛24 ビュー10000 +

おすすめ

転載: blog.csdn.net/q1075355798/article/details/104357938