有一个名为hound的防锈板条箱,用于编写“简单的”原始wave文件,但是我看不到任何将标记写入波形文件的功能。我该怎么办?
编辑: 根据评论,我对写标记的含义还不够具体。为了阐明问题,从而加深对我问题的理解,我指的是“提示”块。有关更多详细信息,请参见here。
编辑2:有人提供了与我的问题类似的答案:https://stackoverflow.com/a/1550865/8725011
答案 0 :(得分:0)
根据猎犬的代码,当前无法写入或读取特定块。但是,对于写操作而言,这应该“简单”,但读操作将需要一些工作。
在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(())
}
}
快速又脏的认证。