采集采集包括录屏、录音、使用摄像头捕获画面。
列出有哪些设备 Linuxffmpeg -devices
-w478
列出V4L2
可用的像素格式
ffmpeg -list_formats all -f v4l2 -i /dev/video0
-w1179 -w789
macOSffmpeg -devices
-w531
列出avfoundation
可用的设备:
ffmpeg -list_devices true -f avfoundation -i ''
-w739 -w673
Windowsffmpeg -devices
-w478
ffmpeg -list_devices true -f dshow -i ''
-w1324 -w1401
录屏 Linux1 2 ffplay -f x11grab \ -i :0.0
BASH
1 2 3 ffmpeg -f x11grab \ -i :0.0 \ out.mp4
BASH
macOS1 2 3 4 ffplay -f avfoundation \ -pixel_format nv12 \ -probesize 10M \ -i 'Capture screen 0'
BASH
1 2 3 4 5 ffmpeg -f avfoundation \ -pixel_format nv12 \ -probesize 10M \ -i 'Capture screen 0' \ out.mp4
BASH
不加入-probesize
选项,会出现警告:not enough frames to estimate rate; consider increasing probesize
Windows1 2 3 ffplay -f gdigrab \ -probesize 10M \ -i desktop
BASH
1 2 3 4 ffmpeg -f gdigrab \ -probesize 10M \ -i desktop \ out.mp4
BASH
采集摄像头画面 & 采集声音 Linux1 2 3 4 5 6 ffplay -f v4l2 \ -framerate 24 \ -video_size 640x480 \ -i /dev/video0 \ -f alsa \ -i default
BASH
1 2 3 4 5 6 7 ffmpeg -f v4l2 \ -framerate 24 \ -video_size 640x480 \ -i /dev/video0 \ -f alsa \ -i default \ out.mp4
BASH
macOS1 2 3 4 5 ffplay -f avfoundation \ -video_size 640x480 \ -framerate 30 \ -pixel_format nv12 \ -i 'FaceTime高清摄像头(内建):外置麦克风'
BASH
1 2 3 4 5 6 ffmpeg -f avfoundation \ -video_size 640x480 \ -framerate 30 \ -pixel_format nv12 \ -i 'FaceTime高清摄像头(内建):外置麦克风' \ out.mp4
BASH
Windows1 2 3 ffplay -rtbufsize 256M \ -f dshow \ -i "video=VMware Virtual USB Video Device:audio=Microphone (High Definition Audio Device)"
BASH
1 2 3 4 ffmpeg -rtbufsize 256M \ -f dshow \ -i "video=VMware Virtual USB Video Device:audio=Microphone (High Definition Audio Device)" \ out.mp4
BASH
不加入-rtbufsize
选项,可能会出现这样的警告信息:real-time buffer [XXX XXX XXX] [video input] too full or near too full (80% of size: 3041280 [rtbufsize parameter])! frame dropped!
,将其设置为较大的值就可以解决
实战:采集视频,添加旋转的水印(徽标),并播放 Linux1 2 3 4 5 6 7 8 9 10 ffmpeg -f v4l2 \ -framerate 24 \ -video_size 640x480 \ -i /dev/video0 \ -loop true \ -i linux-logo-64.png \ -filter_complex "[1:v]format=pix_fmts=rgba,rotate=PI/6*t:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo];[0:v][logo]overlay=x=(W-w)/2:y=(H-h)/2" \ -pix_fmt yuv420p \ -f sdl \ ''
BASH
1 2 3 4 5 6 7 8 ffmpeg -f lavfi \ -i testsrc \ -loop true \ -i linux-logo-64.png \ -filter_complex "[1:v]format=pix_fmts=rgba,rotate=PI/6*t:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo];[0:v][logo]overlay=x=(W-w)/2:y=(H-h)/2" \ -pix_fmt yuv420p \ -f sdl \ ''
BASH
macOS -loop 选项1 2 3 4 5 6 7 8 9 10 11 ffmpeg -f avfoundation \ -video_size 640x480 \ -framerate 30 \ -pixel_format nv12 \ -i 1 \ -loop true \ -i linux-logo-64.png \ -filter_complex "[1:v]format=pix_fmts=rgba,rotate=PI/6*t:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo];[0:v][logo]overlay=x=(W-w)/2:y=(H-h)/2" \ -pix_fmt yuv420p \ -f sdl \ ''
BASH
loop 滤镜1 2 3 4 5 6 7 8 9 ffmpeg -f avfoundation \ -video_size 640x480 \ -framerate 30 \ -pixel_format nv12 \ -i 1 \ -vf "movie=filename=linux-logo-64.png,loop=loop=-1:size=1,format=pix_fmts=rgba,rotate=a=PI/6*t:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo],[in][logo]overlay=x=(W-w)/2:y=(H-h)/2" \ -pix_fmt yuv420p \ -f sdl \ ''
BASH
Windows loop 滤镜1 2 3 4 5 6 7 ffmpeg -rtbufsize 1024M \ -f dshow \ -i "video=VMware Virtual USB Video Device" \ -vf "movie=filename=linux-logo-64.png,loop=loop=-1:size=1,format=rgba,rotate=a=PI/6*t:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo],[in][logo]overlay" \ -pix_fmt yuv420p \ -f sdl \ ' '
BASH
还记得在第03章
提到的内容吗?在Windows
中,输出文件名不能是空字符串,但可以是空白字符串:-f sdl
后面的' '
。