如何在锈迹中写入带有标记的波形文件?

时间:2018-11-06 12:52:42

标签: audio rust wav markers

有一个名为hound的防锈板条箱,用于编写“简单的”原始wave文件,但是我看不到任何将标记写入波形文件的功能。我该怎么办?

编辑: 根据评论,我对写标记的含义还不够具体。为了阐明问题,从而加深对我问题的理解,我指的是“提示”块。有关更多详细信息,请参见here

编辑2:有人提供了与我的问题类似的答案:https://stackoverflow.com/a/1550865/8725011

1 个答案:

答案 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(())
    }
}

快速又脏的认证。