FFmpeg 摄像头 捕获

来自艺搜天下
跳到导航 跳到搜索

input device is considered like a demuxer, and an output device like a muxer

Windows

dshow

DirectShow

列出dshow支持的设备:

ffmpeg -list_devices true -f dshow -i dummy  

注:如果设备名有乱码,可使用DirectShow SDK自带的工具GraphEdit(或者网上下一个GraphStudioNext)即可查看输入名称。

打开GraphEdit选择“图像->插入滤镜”

graphedit.jpg

然后就可以通过查看Audio Capture Sources来查看音频输入设备的简体中文名称了。从图中可以看出是“内装麦克风 (Conexant 20672 SmartAudi”。

audio-device.jpg

采集摄像头和麦克风

ffmpeg -f dshow -i video="Camera":audio="Microphone"  (摄像头名称是Camera,麦克风名称是Microphone) 

采集10秒的视频,并且使用x264进行编码:

ffmpeg -f dshow -i video="Integrated Camera" -t 10 -vcodec libx264 test.mp4  

从摄像头读取数据并编码为H.264,保存成mycamera.mkv

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv  

ffplay可以直接播放摄像头的数据

ffplay -f dshow -i video="Integrated Camera"  

可以使用list_options查看设备的选项:

ffmpeg -list_options true -f dshow -i video="Integrated Camera"  

然后通过输出的信息设置摄像头的参数,如设置摄像头分辨率为1280x720

ffplay -s 1280x720 -f dshow -i video="Integrated Camera"  

获取摄像头数据->编码为H.264->封装为UDP并发送至组播地址

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666  

注:为提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。

高分辨率时,使用UDP可能出现丢包。可以添加–s 参数(例如-s 320x240)调小分辨率。

编码为MPEG2,发布UDP,与编码为H.264类似,指明-vcodec即可

ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666  

播放MPEG2的UDP流:指明-vcodec为mpeg2video即可

ffplay -vcodec mpeg2video udp://233.233.233.223:6666  

获取摄像头数据->编码为H.264->封装为RTP并发送至组播地址。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp  

注:结尾添加“>test.sdp”可以在发布的同时生成sdp文件。该文件可以用于该视频流的播放

如下命令即可播放:

ffplay test.sdp  

获取摄像头数据->编码为H.264->并发送至RTMP服务器

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream  

屏幕录制

Windows平台下,先注册录屏dshow滤镜(如screen-capture-recorder),然后通过dshow获取录屏图像进行编码处理。

因此,在使用FFmpeg屏幕录像之前,需要先安装dshow滤镜。在这里推荐一个软件:screen capture recorder。安装这个软件之后,就可以通过FFmpeg屏幕录像了(可以通过ffmpeg命令列出这个设备)。

http://sourceforge.net/projects/screencapturer/ 下载

https://github.com/rdp/screen-capture-recorder-to-video-windows-free

注意需要Java运行环境。screen capture recorder本身就可以录屏,不过这里我们使用FFmpeg进行录屏。

将屏幕录制后编码为H.264并保存为本地文件。

ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mkv  

此外,也可以录声音,声音输入可以分成两种:一种是真人说话的声音,通过话筒输入;一种是虚拟的声音,即录屏的时候电脑耳机里的声音。

下面两条命令可以分别录制话筒的声音和电脑耳机里的声音。

  • 录屏并伴随话筒输入的声音(适合上课录制)
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="内装麦克风 (Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv   
  • 录屏并伴随耳机输入的声音
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv  

注:如果在听歌,录制的视频中的音频就是那首歌曲。

ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone" output.mkv
ffmpeg -f dshow -i video="UScreenCapture" -f dshow -i audio="Microphone" output.mkv

将屏幕录制后编码为H.264并封装成UDP发送到组播地址

ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666  

将屏幕录制后编码为H.264并封装成RTP并发送到组播地址

ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp  

编码为H.264,发布RTMP

ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream  

注意:播放RTMP的时候,-max_delay参数会影响延迟,将此参数设定小一些,有利于降低延时。

ffplay -max_delay 100000 "rtmp://localhost/oflaDemo/livestream live=1"

gdigrab

FFmpeg还有一个专门用于Windows下屏幕录制的设备:gdigrab(Win32 GDI-based screen capture)

gdigrab是基于GDI的抓屏设备,可以用于抓取屏幕的特定区域。

通过设定不同的输入URL,支持两种方式的屏幕抓取:

(1)“desktop”:抓取整张桌面。或者抓取桌面中的一个特定的区域。

(2)“title={窗口名称}”:抓取屏幕中特定的一个窗口。

最简单的抓屏:

ffmpeg -f gdigrab -i desktop out.mpg  

从屏幕的点(10,20)处开始,抓取640x480的屏幕,设定帧率为5

ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg  
ffmpeg -f gdigrab -framerate 30 -offset_x 10 -offset_y 20 -video_size 640x480 -show_region 1 -i desktop output.mkv #show the area being grabbed

Grab the contents of the window named "Calculator"

ffmpeg -f gdigrab -framerate 6 -i title=Calculator out.mpg

vfwcap

VfW (Video for Windows) ,过时了,最好用dshow

list the supported, connected capture devices:

ffmpeg -y -f vfwcap -i list
ffmpeg -y -f vfwcap -r 25 -i 0 out.mp4   #-i 0指定index 
ffplay -f vfwcap -i 0  

Linux

video4linux2 (v4l2)

list the supported, connected capture devices

v4l2-ctl --list-devices   #yum install v4l-utils

List device capabilities: list available formats (supported pixel formats, video formats, and frame sizes)

ffmpeg -f v4l2 -list_formats all -i /dev/video0
ffplay -f video4linux2 -list_formats all /dev/video0 # 部分电视卡支持多种标准,可以用-list_standards all

or use v4l2-ctl to list available formats:

v4l2-ctl --list-formats-ext  #v4l2-ctl --set-fmt-video=width=640,height=480
ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv
ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0
ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg
ffmpeg -f video4linux2  -i /dev/video0 -c:v h264_omx out.mp4

Brightness, zoom, focus, etc, can be adjusted with v4l2-ctl. Display all controls and their menus:

v4l2-ctl -L

Then adjust the value:

v4l2-ctl -c <option>=<value>

屏幕录制

Linux下使用FFmpeg进行屏幕录制相对比较方便,可以使用x11grab:

ffmpeg -f x11grab -s 1600x900 -r 50 -vcodec libx264 –preset:v ultrafast –tune:v zerolatency -crf 18 -f mpegts udp://localhost:1234
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4

ffmpeg -f alsa -ac 2 -i hw:0,0 -f x11grab -framerate 30 -video_size 1280x720 \
 -i :0.0+0,0 -c:v libx264 -preset veryfast -maxrate 1984k -bufsize 3968k \
 -vf "format=yuv420p" -g 60 -c:a aac -b:a 128k -ar 44100 \
 -f flv rtmp://live.twitch.tv/app/<stream key>

缩小(用scale):

ffmpeg -f alsa -ac 2 -i hw:0,0 -f x11grab -framerate 30 -video_size 1680x1050 \
-i :0.0+0,0 -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 3000k \
-vf "scale=1280:-1,format=yuv420p" -g 60 -c:a aac -b:a 128k -ar 44100 \
-f flv rtmp://live.twitch.tv/app/<stream key>

webcam overlay置于右上角:

ffmpeg -f x11grab -video_size 1680x1050 -framerate 30 -i :0.0 \
-f v4l2 -video_size 320x240 -framerate 30 -i /dev/video0 \
-f alsa -ac 2 -i hw:0,0 -filter_complex \
"[0:v]scale=1024:-1,setpts=PTS-STARTPTS[bg]; \
  [1:v]scale=120:-1,setpts=PTS-STARTPTS[fg]; \
[bg][fg]overlay=W-w-10:10,format=yuv420p[out]"
-map "[out]" -map 2:a -c:v libx264 -preset veryfast \
-maxrate 3000k -bufsize 4000k -c:a aac -b:a 160k -ar 44100 \
-f flv rtmp://live.twitch.tv/app/<stream key>

webcam overlay and logo(webcam overlay在右上角,左下角放logo)

ffmpeg -f x11grab -video_size 1680x1050 -framerate 30 -i :0.0 \
-f v4l2 -video_size 320x240 -framerate 30 -i /dev/video0 \
-f alsa -ac 2 -i hw:0,0 -i logo.png -filter_complex \
"[0:v]scale=1024:-1,setpts=PTS-STARTPTS[bg]; \
  [1:v]scale=120:-1,setpts=PTS-STARTPTS[fg]; \
 [bg][fg]overlay=W-w-10:10[bg2]; \
 [bg2][3:v]overlay=W-w-10:H-h-10,format=yuv420p[out]"
-map "[out]" -map 2:a -c:v libx264 -preset veryfast \
-maxrate 3000k -bufsize 4000k -c:a aac -b:a 160k -ar 44100 -b:a 128k \
-f flv rtmp://live.twitch.tv/app/<stream key>

对本地文件推流

ffmpeg -re -i input.mkv -c:v libx264 -preset veryfast -maxrate 3000k \
-bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 \
-ar 44100 -f flv rtmp://live.twitch.tv/app/<stream key>

如果性能不够,可以先编码,再推

ffmpeg -i input.mkv -c:v libx264 -preset medium -maxrate 3000k -bufsize 6000k \
-vf "scale=1280:-1,format=yuv420p" -g 50 -c:a aac -b:a 128k -ac 2 -ar 44100 file.flv
ffmpeg -re -i file.flv -c copy -f flv rtmp://live.twitch.tv/app/<stream key>

同时推到多个地方(tee muxer只需要编码一次,onfail表示即使某个失败也不影响其它的)

ffmpeg -i input -map 0 -c:v libx264 -c:a aac -maxrate 1000k -bufsize 2000k -g 50 -f tee \
"[f=flv:onfail=ignore]rtmp://facebook|[f=flv:onfail=ignore]rtmp://youtube|local_file.mkv"

OS X

avfoundation and qtkit (deprecated )

AVFoundation

list the supported, connected capture devices:

ffmpeg -f avfoundation -list_devices true -i ""

use the default device which is usually the first device in the listing,可以使用an empty name string or default:

ffmpeg -f avfoundation -i "" out.mpg
ffmpeg -f avfoundation -i "default" out.mpg

设备可以通过名字或index指定:

ffmpeg -f avfoundation -i "Integrated" out.mpg  # Integrated iSight-camera ,使用了前面的缩写
ffmpeg -f avfoundation -i "2" out.mpg
ffmpeg -f avfoundation -i "<screen device index>:<audio device index>" output.mkv

参考

https://trac.ffmpeg.org/wiki/Capture/Webcam

Video4Linux

https://ffmpeg.org/ffmpeg-devices.html#dshow

https://www.ffmpeg.org/ffmpeg-all.html#gdigrab

https://blog.csdn.net/leixiaohua1020/article/details/38284961

https://blog.csdn.net/leixiaohua1020/article/details/16853501

https://trac.ffmpeg.org/wiki/EncodingForStreamingSites