Как мне написать волновой файл с маркерами в ржавчине?
Существует ящик для ржавчины, который называется hound для записи "простых" необработанных волновых файлов, но я не видел ни одной функции для записи маркера в волновой файл. Как бы я это сделал?
РЕДАКТИРОВАТЬ: Согласно комментариям, я не был достаточно конкретным, что я имел в виду под написанием маркера. Чтобы прояснить и таким образом улучшить понимание моего вопроса, я имею в виду куски "кия". Смотрите здесь для более подробной информации.
РЕДАКТИРОВАТЬ 2: кто-то дал ответ на вопрос, похожий на мой: /questions/39666358/kak-zapisat-metki-markeryi-v-fajl-wav-vnet/39666374#39666374
1 ответ
Судя по коду собаки, в настоящее время нет способа написать или прочитать конкретный кусок. Это, однако, должно быть "простым" для записи, но чтение потребует некоторой работы.
Пример реализации, которая добавляет метод на WavWriter:
pub struct Cue {
/// unique identification value
id: u32,
/// play order position
position: u32,
/// RIFF ID of corresponding data chunk
data_chunk_id: [u8; 4],
/// Byte Offset of Data Chunk *
chunk_start: u32,
/// Byte Offset to sample of First Channel
block_start: u32,
/// Byte Offset to sample byte of First Channel
sample_offset: u32,
}
impl<W> WavWriter<W>
where
W: io::Write + io::Seek,
{
pub fn write_sues<'a, T>(&mut self, cues: T) -> io::Result<()>
where
T: IntoIterator<Item = &'a Cue>,
{
let header_size = 12;
let cues = cues.into_iter();
let (_, size) = cues.size_hint();
let mut chunk = Vec::with_capacity(size.unwrap_or(header_size));
{
let mut buffer = io::Cursor::new(&mut chunk[..]);
buffer.set_position(header_size as u64);
let mut n = 0;
for cue in cues {
buffer.write_le_u32(cue.id)?;
buffer.write_le_u32(cue.position)?;
buffer.write_all(&cue.data_chunk_id)?;
buffer.write_le_u32(cue.chunk_start)?;
buffer.write_le_u32(cue.block_start)?;
buffer.write_le_u32(cue.sample_offset)?;
n += 1;
}
buffer.set_position(0);
buffer.write_all(b"sue ")?;
buffer.write_le_u32(4 + n * 24)?;
buffer.write_le_u32(n)?;
}
self.writer.write_all(&chunk)?;
self.data_bytes_written += chunk.len() as u32;
Ok(())
}
}
Быстро и грязно сертифицировано.