首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AudioFlinger中捕获音频数据并保存到原始PCM文件中

在AudioFlinger中捕获音频数据并保存到原始PCM文件中
EN

Stack Overflow用户
提问于 2019-10-06 05:30:48
回答 2查看 1.5K关注 0票数 6

经过一些研究后,我发现这是有可能的捕捉音频数据的libaudioflinger的Android。

我认为音频数据是写在这里的HAL:

代码语言:javascript
复制
ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);

完整代码:https://android.googlesource.com/platform/frameworks/av/+/lollipop-release/services/audioflinger/Threads.cpp#2118

因此,我想将mSinkBuffer +偏移保存到一个文件中(我预计它将是原始的PCM音频文件)。我使用这些流将其写入文件:

代码语言:javascript
复制
std::ofstream audioData ("/data/audiodata.raw", std::fstream::app);
audioData.write((char *)mSinkBuffer + offset, count);
audioData.close();

该文件已成功写入,其中包含数据。但是,当我播放PCM文件(audiodata.raw)时,我唯一听到的声音就是噪音。

代码语言:javascript
复制
aplay -t raw -c 2 -f S16_LE -r 48000 audiodata.raw

我担心的是游戏的配置。所以我打印了一些利伯德的日志:

代码语言:javascript
复制
10-07 10:14:54.575  1300  1366 I AudioFlinger: I/O handle: 13
10-07 10:14:54.575  1300  1366 I AudioFlinger: Standby: no
10-07 10:14:54.575  1300  1366 I AudioFlinger: Sample rate: 48000 Hz
10-07 10:14:54.575  1300  1366 I AudioFlinger: HAL frame count: 512
10-07 10:14:54.575  1300  1366 I AudioFlinger: HAL format: 0x1 (AUDIO_FORMAT_PCM_16_BIT)
10-07 10:14:54.575  1300  1366 I AudioFlinger: HAL buffer size: 2048 bytes
10-07 10:14:54.575  1300  1366 I AudioFlinger: Channel count: 2
10-07 10:14:54.575  1300  1366 I AudioFlinger: Channel mask: 0x00000003 (front-left, front-right)
10-07 10:14:54.575  1300  1366 I AudioFlinger: Processing format: 0x5 (AUDIO_FORMAT_PCM_FLOAT)
10-07 10:14:54.576  1300  1366 I AudioFlinger: Processing frame size: 8 bytes
10-07 10:14:54.576  1300  1366 I AudioFlinger: Pending config events:
10-07 10:14:54.576  1300  1366 I AudioFlinger:  none
10-07 10:14:54.576  1300  1366 I AudioFlinger: Output device: 0x2 (AUDIO_DEVICE_OUT_SPEAKER)
10-07 10:14:54.576  1300  1366 I AudioFlinger: Input device: 0 (AUDIO_DEVICE_NONE)
10-07 10:14:54.576  1300  1366 I AudioFlinger: Audio source: 0 (default)

我不知道我做错了什么。请帮帮我!

谢谢你的进阶!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-10 20:39:13

以附加的双元模式打开文件

std::ofstream audioData (“/data/audodata.raw”,std::fstream::app data::fstream::fstream::binary);

二进制-二进制操作是在二进制模式下执行的,而不是文本.

原始PCM缓冲区应以二进制模式编写。

请检查字节和计数之间的差异代码(添加了一些注释供参考,希望这将解决您的问题)

代码语言:javascript
复制
if (mNormalSink != 0) {

    /* Count is the number of Frames or sample written != bytes  */
    const size_t count = mBytesRemaining / mFrameSize;

    ATRACE_BEGIN("write");
    // update the setpoint when AudioFlinger::mScreenState changes
    uint32_t screenState = AudioFlinger::mScreenState;
    if (screenState != mScreenState) {
        mScreenState = screenState;
        MonoPipe *pipe = (MonoPipe *)mPipeSink.get();
        if (pipe != NULL) {
            pipe->setAvgFrames((mScreenState & 1) ?
                    (pipe->maxFrames() * 7) / 8 : mNormalFrameCount * 2);
        }
    }
    ssize_t framesWritten = mNormalSink->write((char *)mSinkBuffer + offset, count);

    ATRACE_END();
    if (framesWritten > 0) {
        bytesWritten = framesWritten * mFrameSize;
        // std::ofstream audioData ("/data/audiodata.raw", std::fstream::binary);
        /* File write or stream write is the number of bytes written to the file */
        audioData.write((char *)mSinkBuffer + offset, bytesWritten);
        // audioData.close();
    } else {
        bytesWritten = framesWritten;
    }
// otherwise use the HAL / AudioStreamOut directly
}

Audacity -打开原始文件

文件->导入->原始数据

选择原始文件路径

基于你所附的原始文件。

使用这些设置

编码: 32 -bit浮点数

字节顺序:小Endian

频道:2个频道(立体声)

起始偏移量:0

进口金额: 100

抽样率: 48000

文件正常播放,没有任何故障/噪音。

票数 1
EN

Stack Overflow用户

发布于 2019-10-10 09:31:08

当您必须播放原始文件时,您必须对声音帧(如wav或mp3等)使用编解码格式。尝试将原始数据传递给在winmm中定义的WAVEFORMAT,并从可以通过C++中的WAVEFORMAT类型打开和关闭的设备中获取音频。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58254486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档