在文件 flutter 中保存音频流/Uint8List 数据
Save audio stream / Uint8List data in file flutter
我正在从 Android 和 iOS 的记录器插件中获取 Uint8List
。每当我在麦克风的流订阅中获取数据时,我都想将数据写入本地可播放的音频文件。有什么办法可以写入数据吗?
目前,我正在存储这样的数据
recordedFile.writeAsBytesSync(recordedData, flush: true);
它正在将数据写入文件,但无法从文件存储中播放。但是,如果我读取同一个文件并将它的字节提供给插件,它也会播放相同的缓冲区。
我在将我的字节写入文件之前添加了 WAVE/RIFF Header,这为字节和文件提供了元数据。
我的流中有 16 位 PCM 音频字节和 MONO 通道。当我接收字节时,我将这些字节附加到字节列表中。
List<int> recordedData = [];
recordedData.addAll(value);
现在我的列表中有所有记录的字节。
停止录音机后,我调用了以下函数。其中记录了所有数据和采样率。在我的例子中是 44100.
await save(recordedData, 44100);
Future<void> save(List<int> data, int sampleRate) async {
File recordedFile = File("/storage/emulated/0/recordedFile.wav");
var channels = 1;
int byteRate = ((16 * sampleRate * channels) / 8).round();
var size = data.length;
var fileSize = size + 36;
Uint8List header = Uint8List.fromList([
// "RIFF"
82, 73, 70, 70,
fileSize & 0xff,
(fileSize >> 8) & 0xff,
(fileSize >> 16) & 0xff,
(fileSize >> 24) & 0xff,
// WAVE
87, 65, 86, 69,
// fmt
102, 109, 116, 32,
// fmt chunk size 16
16, 0, 0, 0,
// Type of format
1, 0,
// One channel
channels, 0,
// Sample rate
sampleRate & 0xff,
(sampleRate >> 8) & 0xff,
(sampleRate >> 16) & 0xff,
(sampleRate >> 24) & 0xff,
// Byte rate
byteRate & 0xff,
(byteRate >> 8) & 0xff,
(byteRate >> 16) & 0xff,
(byteRate >> 24) & 0xff,
// Uhm
((16 * channels) / 8).round(), 0,
// bitsize
16, 0,
// "data"
100, 97, 116, 97,
size & 0xff,
(size >> 8) & 0xff,
(size >> 16) & 0xff,
(size >> 24) & 0xff,
...data
]);
return recordedFile.writeAsBytesSync(header, flush: true);
}
它正在创建可播放的 WAV 文件。
我正在从 Android 和 iOS 的记录器插件中获取 Uint8List
。每当我在麦克风的流订阅中获取数据时,我都想将数据写入本地可播放的音频文件。有什么办法可以写入数据吗?
目前,我正在存储这样的数据
recordedFile.writeAsBytesSync(recordedData, flush: true);
它正在将数据写入文件,但无法从文件存储中播放。但是,如果我读取同一个文件并将它的字节提供给插件,它也会播放相同的缓冲区。
我在将我的字节写入文件之前添加了 WAVE/RIFF Header,这为字节和文件提供了元数据。
我的流中有 16 位 PCM 音频字节和 MONO 通道。当我接收字节时,我将这些字节附加到字节列表中。
List<int> recordedData = [];
recordedData.addAll(value);
现在我的列表中有所有记录的字节。 停止录音机后,我调用了以下函数。其中记录了所有数据和采样率。在我的例子中是 44100.
await save(recordedData, 44100);
Future<void> save(List<int> data, int sampleRate) async {
File recordedFile = File("/storage/emulated/0/recordedFile.wav");
var channels = 1;
int byteRate = ((16 * sampleRate * channels) / 8).round();
var size = data.length;
var fileSize = size + 36;
Uint8List header = Uint8List.fromList([
// "RIFF"
82, 73, 70, 70,
fileSize & 0xff,
(fileSize >> 8) & 0xff,
(fileSize >> 16) & 0xff,
(fileSize >> 24) & 0xff,
// WAVE
87, 65, 86, 69,
// fmt
102, 109, 116, 32,
// fmt chunk size 16
16, 0, 0, 0,
// Type of format
1, 0,
// One channel
channels, 0,
// Sample rate
sampleRate & 0xff,
(sampleRate >> 8) & 0xff,
(sampleRate >> 16) & 0xff,
(sampleRate >> 24) & 0xff,
// Byte rate
byteRate & 0xff,
(byteRate >> 8) & 0xff,
(byteRate >> 16) & 0xff,
(byteRate >> 24) & 0xff,
// Uhm
((16 * channels) / 8).round(), 0,
// bitsize
16, 0,
// "data"
100, 97, 116, 97,
size & 0xff,
(size >> 8) & 0xff,
(size >> 16) & 0xff,
(size >> 24) & 0xff,
...data
]);
return recordedFile.writeAsBytesSync(header, flush: true);
}
它正在创建可播放的 WAV 文件。