【秒懂音視訊開發】19_視訊錄製01_命令列

M了個J發表於2021-04-29

本文的主要內容:演示如何利用命令列採集攝像頭的視訊資料。
閱讀本文之前,建議先閱讀《音訊錄製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

相關文章