辅助函数:YUYV -> JPEG 注意:这里的性能不是最优的,仅做演示。 生产环境应直接使用 libjpeg-turbo 的 C 绑定或 SIMD 优化的库。
(yuyv_data: &[u8], width: u32, height: u32)
| 184 | /// 注意:这里的性能不是最优的,仅做演示。 |
| 185 | /// 生产环境应直接使用 libjpeg-turbo 的 C 绑定或 SIMD 优化的库。 |
| 186 | fn encode_frame_to_jpeg(yuyv_data: &[u8], width: u32, height: u32) -> Result<Vec<u8>> { |
| 187 | // 1. YUYV -> RGB (复用之前的逻辑) |
| 188 | let mut rgb_buffer = vec![0u8; (width * height * 3) as usize]; |
| 189 | yuyv_to_rgb8(yuyv_data, &mut rgb_buffer); |
| 190 | |
| 191 | // 2. RGB -> JPEG (使用 image crate) |
| 192 | let mut jpeg_buffer = Vec::new(); |
| 193 | let img_buffer = image::RgbImage::from_raw(width, height, rgb_buffer) |
| 194 | .ok_or_else(|| anyhow::anyhow!("Failed to create image buffer"))?; |
| 195 | |
| 196 | // 使用 JpegEncoder 写入内存,质量设为 75 |
| 197 | let mut encoder = image::codecs::jpeg::JpegEncoder::new_with_quality(&mut jpeg_buffer, 75); |
| 198 | encoder.encode_image(&img_buffer)?; |
| 199 | |
| 200 | Ok(jpeg_buffer) |
| 201 | } |
| 202 | |
| 203 | #[cfg(target_os = "linux")] |
| 204 | // 专门为 image crate 优化的 YUYV -> RGB8 (R,G,B, R,G,B...) |