【秒懂音視頻開發】19_視頻錄制01_命令行


本文的主要內容:演示如何利用命令行采集攝像頭的視頻數據。
閱讀本文之前,建議先閱讀《音頻錄制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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM