linux下调用摄像头拍照-v4l2与ffmpeg
我的实际操作记录
v4l2获取图像部分
找到了这位大佬的博客[6],是本文学习的基础。具体操作总结如下。
1 |
|
但我在第6️⃣步时没能成功输出能看的图片,于是下载了obs试试可行性,确认可行。obs作为开源软件可以方便的查看它的原代码。下附部分obs返回的调试消息[5]。
- 通过在开源代码里寻找,找到了疑似实现功能的代码片段[1]。但是我看不懂😵💫,于是搜寻其他信息
- 我虽然知道YUV和RGB不同,却不知道还有.yuv这种格式,6️⃣步所得的结果并不能以.jpg方式打开/.yuv格式打开结果不正常,因此需要进行转换。我使用网上找到的命令(下代码块第一行),打开能看到大概外形但是像素位置错乱。估计因为没有选择正确的”-pix_fmt”
- 通过指定原-pix_fmt获得了正确结果(下代码块第二行)[2]
1
2ffmpeg -s 640x480 -i test.yuv aa.jpeg #(错误代码)
ffmpeg -y -s:v 640x480 -pix_fmt yuyv422 -i test.yuv result.jpg #(正确代码)
还有一段命令也是我找到的,但我没试过可行性同时也忘了记录来源:
ffmpeg -s 640x480 -i bbb.yuv -ss 00:00:00 -c:v libx264 -s:v 640x480 -preset slow -t 00:08:20 output.mp4
创建内存盘部分
信息挖掘
随后上网寻找创建内存盘的方法,参考了如下几个网站的内容
实际执行[3][4]
创建内存盘
1 |
|
解决问题
然后我写了个shell脚本,越写越上头,不负责任的说这是我写过最美的代码。
需要安装v4l2和ffmpeg,其他什么都不要,奏似这么轻量。
扩展阅读
https://chtseng.wordpress.com/2022/07/18/使用v4l2-ctl調整-usb-camera參數/
http://zhaoxuhui.top/blog/2021/09/23/v4l2-introduction-and-usb-camera-bayer-raw-data.html
https://silencewt.github.io/2015/04/29/v4l2的学习建议和流程解析/
脚本及执行方法
例:复制到capcam.sh中
- chmod +x capcam.sh
- 执行./capcam.sh
- 结束
- 另外,./capcam.sh clean清理目录,./capcam.sh mod手动定义捕获参数
1 |
|
1 |
|
附录
- https://github.com/obsproject/obs-studio/blob/c5015d0e6cb180d138e1a9e2258afd903254b9ea/plugins/linux-v4l2/v4l2-input.c ↩
- https://stackoverflow.com/questions/70961566/how-to-convert-raw-yuv-image-to-jpg ↩
- https://unix.stackexchange.com/questions/26364/how-can-i-create-a-tmpfs-as-a-regular-non-root-user ↩
- https://superuser.com/questions/389500/how-can-i-mount-a-tmpfs-without-root ↩
- ↩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20info: v4l2-input: /dev/video1 seems to not support video capture
info: v4l2-input: Found device 'USB Camera: USB Camera' at /dev/video0
info: v4l2-input: Start capture from /dev/video2
error: v4l2-input: Unable to open device
error: v4l2-input: Initialization failed, errno: 没有那个文件或目录
info: v4l2-input: Start capture from /dev/video0
info: v4l2-input: Input: 0
info: v4l2-input: Found input 'Camera 1' (Index 0)
info: v4l2-controls: setting default for Power Line Frequency to 2
info: v4l2-input: Pixelformat: YUYV 4:2:2 (available)
info: v4l2-input: Pixelformat: RGB3 (Emulated) (unavailable)
info: v4l2-input: Pixelformat: BGR3 (Emulated) (available)
info: v4l2-input: Pixelformat: YU12 (Emulated) (available)
info: v4l2-input: Pixelformat: YV12 (Emulated) (available)
info: v4l2-input: Stepwise and Continuous framesizes are currently hardcoded
info: v4l2-input: Resolution: 640x480
info: v4l2-input: Pixelformat: YUYV
info: v4l2-input: Linesize: 1280 Bytes
info: v4l2-input: Framerate: 30.00 fps
info: v4l2-input: /dev/video0: select timeout set to 166666 (5x frame periods) - http://zhaoxuhui.top/blog/2021/09/23/v4l2-introduction-and-usb-camera-bayer-raw-data.html ↩
linux下调用摄像头拍照-v4l2与ffmpeg
https://zhaosn.github.io/2022/v4l2-theLinuxVideoSolution/