首页 > 解决方案 > LibSNDfile / Obeo 音频录制 Android 未正确写入标头

问题描述

我正在编写一个使用 Obeo 录制音频并使用 libsndfile 写入波形文件的 Android 应用程序。

我通过编辑指定文件数据部分大小的 Subchunk2Size 验证了音频流数据是否正确。这会产生一个可播放的音频文件,它告诉我正在写入数据,但这个变量除外。

所以问题是:为什么 libsndfile 不将 subchunksize(数据大小)变量写入波头?

Wave 文件头结构

我将文件作为 RDWR 打开,因为需要附加音频(当用户暂停或停止音频时,他们可以继续录制到同一个文件)。

这是文件打开代码:

注意:文件指针是全局的,我将它包含在其中只是为了显示它是什么结构。

      SF_INFO info;
    info.channels = channel_count;
    info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
    info.samplerate = sample_rate;
    // info.seekable = SF_TRUE;
    SNDFILE * file = sf_open(url.c_str(), SFM_RDWR, &info);

Obeo 使用回调返回数据。这是我的回调,每当音频设备填充指定的缓冲区时都会调用它。

DataCallbackResult Recorder::onAudioReady(
    oboe::AudioStream * stream, void * audio_data, int32_t num_of_frames){

    //  __android_log_print(ANDROID_LOG_INFO,
    //                     "AudioEngine", "Callback!.");

    sf_seek(file, 0, SEEK_END);
    sf_writef_short(file, reinterpret_cast<const short*>(audio_data), num_of_frames);

    return DataCallbackResult::Continue;
}

稍后在类解构中,我打电话给:

   sf_write_sync(file);
   sf_close(file);

这是 Libsndfile 写入的二进制数据的十六进制。

 52494646 08000000 
 57415645 666D7420 
 10000000 03000200
 44AC0000 20620500 
 08002000 66616374 
 04000000 00000000  (data) 64617461 (subchunksize) 00000000

非常感谢在 linux 或 android 上使用过 libsndfile 的用户提供的任何信息!

谢谢你。

标签: androidc++caudiolibsndfile

解决方案


我相信您需要指定您正在使用的frames属性。info struct这让文件在分配时确切知道文件需要多大。

IE

SF_INFO info;
info.samplerate = SAMPLE_RATE ;
info.frames     = SAMPLE_COUNT ; // 44100 * 4 (4 seconds of 44.1kHz sample rate)
info.channels       = 2 ;
info.format     = (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ;

这如libsndfile 的示例之一所示。


推荐阅读