本文的主要內容:演示如何利用命令列採集攝像頭的視訊資料。
閱讀本文之前,建議先閱讀《音訊錄製01_命令列》對常用命令作一個基本認識。
Windows
dshow支援的裝置
ffmpeg -f dshow -list_devices true -i dummy
輸出結果大致如下所示。
DirectShow video devices (some may be both video and audio devices)
"Integrated Camera"
DirectShow audio devices
"麥克風陣列 (Realtek(R) Audio)"
Integrated Camera是我筆記本上自帶的攝像頭,等會我們就是通過這個攝像頭採集視訊資料。
dshow支援的引數
ffmpeg -h demuxer=dshow
輸出結果大致如下所示。
dshow indev AVOptions:
-video_size <image_size> set video size given a string such as 640x480 or hd720.
-pixel_format <pix_fmt> set video pixel format (default none)
-framerate <string> set video frame rate
-list_devices <boolean> list available devices (default false)
-list_options <boolean> list available options for specified device (default false)
- -video_size:解析度
- -pixel_format:畫素格式
- -framerate:幀率(每秒採集多少幀畫面)
- -list_devices:true表示列出dshow支援的所有裝置
- -list_options:true表示列出特定裝置支援的所有引數
攝像頭支援的引數
ffmpeg -f dshow -list_options true -i video="Integrated Camera"
輸出結果大致如下所示。
DirectShow video device options (from video devices)
Pin "捕獲" (alternative pin name "捕獲")
vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30
vcodec=mjpeg min s=320x180 fps=30 max s=320x180 fps=30
vcodec=mjpeg min s=320x240 fps=30 max s=320x240 fps=30
vcodec=mjpeg min s=352x288 fps=30 max s=352x288 fps=30
vcodec=mjpeg min s=424x240 fps=30 max s=424x240 fps=30
vcodec=mjpeg min s=640x360 fps=30 max s=640x360 fps=30
vcodec=mjpeg min s=640x480 fps=30 max s=640x480 fps=30
vcodec=mjpeg min s=848x480 fps=30 max s=848x480 fps=30
vcodec=mjpeg min s=960x540 fps=30 max s=960x540 fps=30
pixel_format=yuyv422 min s=1280x720 fps=10 max s=1280x720 fps=10
pixel_format=bgr24 min s=1280x720 fps=10 max s=1280x720 fps=10
pixel_format=yuyv422 min s=320x180 fps=30 max s=320x180 fps=30
pixel_format=bgr24 min s=320x180 fps=30 max s=320x180 fps=30
pixel_format=yuyv422 min s=320x240 fps=30 max s=320x240 fps=30
pixel_format=bgr24 min s=320x240 fps=30 max s=320x240 fps=30
pixel_format=yuyv422 min s=352x288 fps=30 max s=352x288 fps=30
pixel_format=bgr24 min s=352x288 fps=30 max s=352x288 fps=30
pixel_format=yuyv422 min s=424x240 fps=30 max s=424x240 fps=30
pixel_format=bgr24 min s=424x240 fps=30 max s=424x240 fps=30
pixel_format=yuyv422 min s=640x360 fps=30 max s=640x360 fps=30
pixel_format=bgr24 min s=640x360 fps=30 max s=640x360 fps=30
pixel_format=yuyv422 min s=640x480 fps=30 max s=640x480 fps=30
pixel_format=bgr24 min s=640x480 fps=30 max s=640x480 fps=30
pixel_format=yuyv422 min s=848x480 fps=20 max s=848x480 fps=20
pixel_format=bgr24 min s=848x480 fps=20 max s=848x480 fps=20
pixel_format=yuyv422 min s=960x540 fps=15 max s=960x540 fps=15
pixel_format=bgr24 min s=960x540 fps=15 max s=960x540 fps=15
可以看到攝像頭支援的解析度、畫素格式、幀率等引數。
錄製
ffmpeg -f dshow -i video="Integrated Camera" out.yuv
輸出結果大致如下所示。
Input #0, dshow, from 'video=Integrated Camera':
Stream #0:0: Video: mjpeg, yuvj422p, 1280x720, 30 fps
Output #0, rawvideo, to 'out.yuv':
Stream #0:0: Video: rawvideo, yuvj422p, 1280x720, 30 fps
根據輸出結果,不難看出:
-
從攝像頭採集的資料,最終存成了YUV格式
-
攝像頭的預設引數
- 解析度:1280x720
- 畫素格式:yuvj422p
- 幀率:30fps
所以,播放YUV時的命令如下所示。
- 需要注意的是:YUV檔案中只儲存了影像資訊,並沒有聲音資訊
- 因此,播放YUV時是聽不到任何聲音的
- ffplay的framerate預設值是25
ffplay -video_size 1280x720 -pixel_format yuvj422p -framerate 30 out.yuv
可以自定義引數進行錄製。
ffmpeg -f dshow -video_size 640x480 -pixel_format yuyv422 -framerate 30 -i video="Integrated Camera" out.yuv
播放錄製好的YUV。
ffplay -video_size 640x480 -pixel_format yuyv422 -framerate 30 out.yuv
Mac
avfoundation支援的裝置
ffmpeg -f avfoundation -list_devices true -i ''
輸出結果大致如下所示。
AVFoundation video devices:
[0] FaceTime高清攝像頭(內建)
[1] Capture screen 0
AVFoundation audio devices:
[0] Soundflower (64ch)
[1] Edu Audio Device
[2] MacBook Pro麥克風
[3] Soundflower (2ch)
0號裝置就是Mac自帶的攝像頭。
avfoundation支援的引數
ffmpeg -h demuxer=avfoundation
輸出結果大致如下所示。
AVFoundation indev AVOptions:
-list_devices <boolean> .D........ list available devices (default false)
-pixel_format <pix_fmt> .D........ set pixel format (default yuv420p)
-framerate <video_rate> .D........ set frame rate (default "ntsc")
-video_size <image_size> .D........ set video size
- -video_size:解析度
- -pixel_format:畫素格式
- 預設是yuv420p
- -framerate:幀率(每秒採集多少幀畫面)
- 預設是ntsc,也就是30000/1001,約等於29.970030
- -list_devices:true表示列出avfoundation支援的所有裝置
錄製
# 使用0號視訊裝置
ffmpeg -f avfoundation -i 0 out.yuv
然後你可能會遇到一個錯誤:這個裝置(攝像頭)不支援29.970030的幀率。
Selected framerate (29.970030) is not supported by the device
重新設定個30的幀率試試。
ffmpeg -f avfoundation -framerate 30 -i 0 out.yuv
然後你會看到以下提示資訊。
- 這個裝置(攝像頭)不支援yuv420p
- 只支援uyvy422、yuyv422、nv12、0rgb、bgr0
- 並且自動選擇使用uyvy422來替代yuv420p
Selected pixel format (yuv420p) is not supported by the input device.
Supported pixel formats:
uyvy422
yuyv422
nv12
0rgb
bgr0
Overriding selected pixel format to use uyvy422 instead.
與此同時,也成功開始採集攝像頭的視訊資料了。
- 畫素格式:uyvy422
- 解析度:1280x720
- 幀率:30
Input #0, avfoundation, from '0':
Stream #0:0: Video: rawvideo, uyvy422, 1280x720
Output #0, rawvideo, to 'out.yuv':
Stream #0:0: Video: rawvideo, uyvy422, 1280x720, 30 fps
播放錄製好的YUV。
ffplay -video_size 1280x720 -pixel_format uyvy422 -framerate 30 out.yuv