前言
FFmpeg是一个强大的开源多媒体处理工具,它可以用于录制、转换以及流化音频和视频。它是一个跨平台的项目,可以在多种操作系统上运行,包括Windows、Mac OS和Linux。这个工具可以执行各种各样的音视频处理任务,包括但不限于:
- 转换格式:可以将一种音频或视频格式转换为另一种。比如,你可以将一个MP4视频转换成AVI格式,或者将一个WAV音频文件转换成MP3。
- 裁剪和剪辑:可以从视频或音频文件中剪裁或提取特定的片段。
- 合并和拼接:可以将多个音频或视频文件合并成一个文件,或者将多个文件拼接成一个序列。
- 添加水印和字幕:可以在视频中添加图片水印或文本字幕。
- 调整参数:可以调整视频的分辨率、帧率、比特率等参数。
- 流媒体处理:可以将音频或视频流化,以便通过网络进行实时传输。
ffmpeg相关命令
相关概念
- 音/视频流:在音视频领域,一路音/视频成为一路流。
- 容器:一般把mp4、flv、mov等文件格式称之为容器。在这些常用格式文件中可以存放多路音视频文件。以mp4为例,可以存放一路视频流,多路音频流,多路字幕流。
- channel:channel是音频中的概念,称之为声道,在一路音频流中可以有单声道、双声道和立体声。
基本命令格式
代码语言:javascript复制ffmpeg [global_options] {[input_file_options] -i input_url}... {[output_file_options] output_url}...
windows下查看音视频设备列表
代码语言:javascript复制ffmpeg -list_devices true -f dshow -i dummy
音视频录制
screen-capture-recorder
桌面采集工具,可以用来录制桌面;自带虚拟音频捕获器,录制桌面的音频;需要安装java环境。它还包括一个免费的、通用的、开源的DirectShow桌面/屏幕源捕获过滤器。下载地址 https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases
ffmpeg配合screen-capture-recorder录屏命令:
代码语言:javascript复制ffmpeg -f dshow -i video="screen-capture-recorder" -r 20 -t 10 screen-capture.mp4
# -t 10 for 10 seconds recording
代码语言:javascript复制#列出设备列表
ffmpeg -list_devices true -f dshow -i dummy
#全屏录像
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -acodec libmp3lame -s 1280x720 -r 15 e:/temp/temp.mkv
- -f 指定使用dshow采集数据
- -i 指定从哪里采集数据
- -r 指定帧率(-framerate用来限制输入,-r用来限制输出)桌面的输入对帧率没有要求,所以不用限制桌面的帧率,其实限制了也没用。
- -s 设置窗口大小 -s 100x200 将桌面画布压缩为100x200
#gdigrab录屏,h264编码
ffmpeg -f gdigrab -i desktop -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -acodec libmp3lame -s 1280x720 -r 15 G:ffmpegtestouttemp.mkv
音视频录制
代码语言:javascript复制#调用本地麦克风录制音频,保存到文件
ffmpeg -f dshow -i audio="麦克风(Conexant SmartAudio HD)" G:/testout/1.mp3
代码语言:javascript复制#调用摄像头录制视频,并保存到文件
ffmpeg -f dshow -i video="Lenvo EasyCamera" G:/testout/1.flv
代码语言:javascript复制#调用摄像头和麦克风录制音视频,保存到文件
ffmpeg -f dshow -i video="" -f dshow -i audio="" G:/testout/2.flv
直播推流
摄像头推流
代码语言:javascript复制ffmpeg -f dshow -i video="Lenovo EasyCamera":audio="麦克风 (Conexant SmartAudio HD)" -acodec aac -strict experimental -ar 44100 -b:a 200k -b:v 1500k -preset:v veryfast -f flv rtmp://203.195.150.231:1935/live/
桌面推流
代码语言:javascript复制ffmpeg -f dshow -i video="screen-capture-recorder":audio="virtual-audio-capturer" -acodec aac -strict experimental -ar 44100 -b:a 150k -b:v 2500k -preset:v veryfast -f flv rtmp://*.*.*.*/live/vad
桌面音频推流
代码语言:javascript复制ffmpeg -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -acodec aac -strict experimental -ar 44100 -b:a 200k -b:v 2500k -preset:v ultrafast -f flv rtmp://*.*.*.*/live/vad
推rtsp流
代码语言:javascript复制ffmpeg -i rtsp://192.168.0.189:554/stream/main -codec copy -rtsp_transport tcp -r 15 -s 1366x768 -f rtsp rtsp://x.x.x.x:554/stream/main
推rtmp流
代码语言:javascript复制#推流到流服务器
ffmpeg -f dshow -i video="screen-capture-recorder" -r 15 -s 990x512 -f flv rtmp://203.195.150.231:1935/live/
#使用ffplay拉流播放
ffplay "rtmp://203.195.150.231:1935/live/ live=1"
#读取流音频,保存到本地
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
播放rtmp流
代码语言:javascript复制ffplay "rtmp://192.168.134.130:1936/live/dc live=1"
视频推流
代码语言:javascript复制ffmpeg -re -i f:/8.mp4 -vcodec copy -acodec copy -f flv -r 30 -b:v 1000k rtmp://*.*.*.*/live/vad2
视频循环推流
代码语言:javascript复制ffmpeg -re -stream_loop -1 -i f:/8.mp4 -vcodec copy -acodec copy -f flv -r 30 -b:v 1000k rtmp://*.*.*.*/live/vad2
格式转换
将0806.mp4由mp4转换为flv:
代码语言:javascript复制ffmpeg -i 0806.mp4 0806f.flv
视频截取
代码语言:javascript复制ffmpeg -i 0806.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:30 cutout.mp4 -y (不精确,会有几秒的误差)
ffmpeg -accurate_seek -i I:/8.mp4 -codec copy -y -ss 00:00:10 -to 00:00:30 I:/8-cut.mp4 (更精确)
添加字幕
代码语言:javascript复制1)嵌入到视频(嵌入到视频流)
ffmpeg -i 0806.mp4 -vf subtitles=a.srt srtout.mp4
2)嵌入到视频(嵌入到字幕流)
ffmpeg -i 0806.mp4 -i a.srt -c:s mov_text -c:v copy -c:a copy srtout3.mp4
ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
ffmpeg -filter_complex "subtitles='a.srt File - 1 srtout.mp4'"
添加LOGO水印
代码语言:javascript复制ffmpeg -i I:/8.mp4 -i I:/logo.png -filter_complex overlay I:/8-logo.mp4
ffmpeg -i /mnt/hgfs/shared/resource/shenghua.avi -i /mnt/hgfs/shared/resource/my_logo.png -filter_complex overlay /mnt/hgfs/shared/resource/shenghua_die.mp4
过滤器的使用
将输入的1920*1080缩小到960*540输出
代码语言:javascript复制ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
#如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。
为视频添加LOGO
想要贴到一个视频上,那可以用如下命令:
代码语言:javascript复制ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
结果如下所示:
要贴到其他地方?看下面:
代码语言:javascript复制#右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
#左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
#右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
去掉视频中的LOGO
语法:-vf delogo=x:y:w:h[:t[:show]]
- x:y: 离左上角的坐标
- w:h: logo的宽和高
- t: 矩形边缘的厚度默认值4
- show:若设置为1有一个绿色的矩形,默认值0。
完整命令:
代码语言:javascript复制ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
结果如下图所示:
截取视频图像
代码语言:javascript复制ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-d.jpeg
- -r:表示每一秒几帧
- -q:v:表示存储jpeg的图像质量,一般2是高质量。 ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。
可以设置开始时间和你想要截取的时间:
代码语言:javascript复制ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-d.jpeg
- -ss:表示开始时间
- -t:表示共要多少时间。 这样,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。
序列帧与视频的相互转换
分离视频音频流
代码语言:javascript复制#分离视频流
ffmpeg -i input_file -vcodec copy -an output_file_video
#分离音频流
ffmpeg -i input_file -acodec copy -vn output_file_audio
视频解复用
代码语言:javascript复制ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
视频转码
代码语言:javascript复制#转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264
#转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264
#转码为封装文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi
- -bf:B帧数目控制
- -g:关键帧间隔控制
- -s:分辨率控制
视频封装
代码语言:javascript复制ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
视频剪切
代码语言:javascript复制#提取图片
ffmpeg –i test.avi –r 1 –f image2 image-=.jpeg
#剪切视频
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi
- -r 提取图像的频率
- -ss 开始时间
- -t 持续时间
常用参数说明
主要参数:
- -i:设定输入流
- -f:设定输出格式
- -ss:开始时间
视频参数:
- -b:设定视频流量,默认为200Kbit/s
- -r:设定帧速率,默认为25
- -s:设定画面的宽与高
- -aspect:设定画面的比例
- -vn:不处理视频
- -vcodec:设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
- -ar:设定采样率
- -ac:设定声音的Channel数
- -acodec:设定声音编解码器,未设定时则使用与输入流相同的编解码器
- -an:不处理音频
结尾
本篇文章总结ffmpeg的一些常用的命令(windows)
本文出处: https://www.cnblogs.com/dch0/p/11149266.html