#h264 #video-stream #video-streaming #v4l2 #camera #capture

h264_webcam_stream

在Linux中从v4l2摄像头捕获h264视频

1个不稳定版本

0.1.0 2022年12月10日

#431 in 视频

MIT/Apache

12KB
186

h264_webcam_stream

此crate提供来自任何v4l2视频设备的h264视频流。

仅支持mjpeg的视频设备将由openh264库重新编码为h264(一个应能在任何CPU架构上工作的C++编码器)。

捕获H264视频

将h264文件流式传输到视频很简单

fn main() -> Result<()> {
    let device_path = Path::new("/dev/video0");
    let max_fps = 60;

    let mut device = h264_webcam_stream::get_device(&device_path)?;
    let mut stream = h264_webcam_stream::stream(&mut device, max_fps)?;

    let mut f = std::fs::File::create("./test.h264")?;

    for _ in 0..120 {
        let (h264_bytes, _) = stream.next(false)?;
        // Record the h264 video to a file
        f.write_all(&h264_bytes[..])?;
    }

    Ok(())
}

列出视频捕获设备

获取视频捕获设备的列表也很简单

let devices: Vec<_> = h264_webcam_stream::list_devices()
    .into_iter()
    .collect();

println!("Video devices: {:?}", devices);

捕获静态图像

h264_webcam_stream支持同时捕获H264视频流和YUV编码的图像。

YUV图像捕获可用于从视频流中捕获静态图像,或通过在固定间隔或基于某些外部触发器有选择性地将帧重新编码为h264来创建时间流逝视频。

要启用视频捕获和图像捕获,请将true传递给stream.next

let (h264_bytes, yuv_still_image) = stream.next(true)?;

仅限Linux

目前此crate仅支持Linux。

我目前没有计划自己实现对其他操作系统的支持,但如果您想为其他操作系统实现h264网络摄像头流,请随时提交pull request!

依赖项

~11MB
~169K SLoC