1 use { 2 super::errors::FlvMuxerError, byteorder::BigEndian, bytes::BytesMut, 3 bytesio::bytes_writer::BytesWriter, 4 }; 5 6 const FLV_HEADER: [u8; 9] = [ 7 0x46, // 'F' 8 0x4c, //'L' 9 0x56, //'V' 10 0x01, //version 11 0x05, //00000101 audio tag and video tag 12 0x00, 0x00, 0x00, 0x09, //flv header size 13 ]; // 9 14 pub const HEADER_LENGTH: u32 = 11; 15 pub struct FlvMuxer { 16 pub writer: BytesWriter, 17 } 18 19 impl Default for FlvMuxer { default() -> Self20 fn default() -> Self { 21 Self::new() 22 } 23 } 24 25 impl FlvMuxer { new() -> Self26 pub fn new() -> Self { 27 Self { 28 writer: BytesWriter::new(), 29 } 30 } 31 write_flv_header(&mut self) -> Result<(), FlvMuxerError>32 pub fn write_flv_header(&mut self) -> Result<(), FlvMuxerError> { 33 self.writer.write(&FLV_HEADER)?; 34 Ok(()) 35 } 36 write_flv_tag_header( &mut self, tag_type: u8, data_size: u32, timestamp: u32, ) -> Result<(), FlvMuxerError>37 pub fn write_flv_tag_header( 38 &mut self, 39 tag_type: u8, 40 data_size: u32, 41 timestamp: u32, 42 ) -> Result<(), FlvMuxerError> { 43 //tag type 44 self.writer.write_u8(tag_type)?; 45 //data size 46 self.writer.write_u24::<BigEndian>(data_size)?; 47 //timestamp 48 self.writer.write_u24::<BigEndian>(timestamp & 0xffffff)?; 49 //timestamp extended. 50 let timestamp_ext = (timestamp >> 24 & 0xff) as u8; 51 self.writer.write_u8(timestamp_ext)?; 52 //stream id 53 self.writer.write_u24::<BigEndian>(0)?; 54 55 Ok(()) 56 } 57 write_flv_tag_body(&mut self, body: BytesMut) -> Result<(), FlvMuxerError>58 pub fn write_flv_tag_body(&mut self, body: BytesMut) -> Result<(), FlvMuxerError> { 59 self.writer.write(&body[..])?; 60 Ok(()) 61 } 62 write_previous_tag_size(&mut self, size: u32) -> Result<(), FlvMuxerError>63 pub fn write_previous_tag_size(&mut self, size: u32) -> Result<(), FlvMuxerError> { 64 self.writer.write_u32::<BigEndian>(size)?; 65 Ok(()) 66 } 67 } 68