android - LibSNDfile / Obeo 音频录制 Android 未正确写入标头
问题描述
我正在编写一个使用 Obeo 录制音频并使用 libsndfile 写入波形文件的 Android 应用程序。
我通过编辑指定文件数据部分大小的 Subchunk2Size 验证了音频流数据是否正确。这会产生一个可播放的音频文件,它告诉我正在写入数据,但这个变量除外。
所以问题是:为什么 libsndfile 不将 subchunksize(数据大小)变量写入波头?
我将文件作为 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
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 的示例之一所示。
推荐阅读
- node.js - 初始化另一个服务后,如何在 inversify 中绑定服务?
- asp.net - 复杂的 LINQ 查询 - 多表关系
- excel - Excel 的动态连接字符串中的错误
- c# - 如何从正在运行的 UWP 应用程序的窗口中检索图标/图像?
- android - 每次新建Activity都会报错“找不到符号类DaggerAppComponent”
- cucumber - 是否可以将 .spec 文件转换为 .feature 文件?
- python - Django build efficiency with API
- elasticsearch - 如果适用,按“年龄”提升 Elasticsearch 结果
- apache-spark - 聚类算法的建议?
- reactjs - 函数在钩子中运行一次