gpt4 book ai didi

android - LibSNDfile/Obeo 音频录制 Android 未正确写入 header

转载 作者:行者123 更新时间:2023-12-03 00:25:21 25 4
gpt4 key购买 nike

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

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

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

Wave File Header Structure

我将文件作为 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 !

谢谢你。

最佳答案

我相信您需要指定 frames info 上的属性(property)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's examples 之一所示。 .

关于android - LibSNDfile/Obeo 音频录制 Android 未正确写入 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60406602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com