
目录
[推流(Pushing stream)](#推流(Pushing stream))
[拉流(Pulling stream)](#拉流(Pulling stream))
网络流操作
常用参数说明:
- -re 以原生帧率读取输入
- -c copy 直接复制流,不重新编码
- -c:v libx264 视频编码为H.264
- -c:a aac 音频编码为AAC
- -f flv/rtsp/mp4 指定输出格式为flv/rtsp/mp4
- -preset ultrafast 编码速度优先(牺牲压缩率)
- -b:v 1000k 设置视频比特率1000k
- -r 30 设置帧率30fps
- -s 1280x720 设置分辨率720p
推流(Pushing stream)
本地文件推流
//推送到RTMP服务器
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamkey
//推送到RTSP服务器
ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://server/live/stream
设备(摄像头/麦克风)推流
//Linux系统
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:0 -c:v libx264 -c:a aac -f flv rtmp://server/live/stream
//Windows系统
ffmpeg -f dshow -i video="camera-name" -f dshow -i audio="microphone-name" -c:v libx264 -c:a aac -flv rtmp://server/live/stream
屏幕录制推流
//Linux使用x11grab
ffmpeg -f x11grab -s 1920x1080 -i :0.0 -f alsa -i hw:0 -c:v libx264 -c:a aac -f flv rtmp://server/live/stream
//Windows使用gdigrab
ffmpeg -f gdigrab -i desktop -c:v libx264 -preset ultrafast -f flv rtmp://server/live/stream
拉流(Pulling stream)
保存到本地文件
//从RTMP拉流保存
ffmpeg -i rtmp://server/live/stream -c copy output.mp4
//从HTTP拉流保存
ffmpeg -i http://server/live/stream.m3u8 -c copy output.mp4
//从RTSP拉流保存
ffmpeg -i rtsp://server/live/stream -c copy output.mp4
转发/中继
//将流视频转发到另一个服务器
ffmpeg -i rtmp://server1/live/stream -c copy -f flv rtmp://server2/live/stream
实时播放
//使用ffplay播放
ffplay rtmp://server/live/stream
ffplay http://server/live/stream.m3u8
ffplay rtsp://server/live/stream
流操作
常用参数说明:
- -i 指定输入文件
- -c:v 视频编解码
- -c:a 音频编解码
- -b:v 视频比特率
- -b:a 音频比特率
- -vf 视频滤镜
- -af 音频滤镜
- -vn 去除视频
- -an 去除音频
- -ss 开始时间
- -t 持续时间
- -to 结束时间
- -r 帧率
查看流信息
查看MP4文件中都有哪些流

格式转换
将FLV格式转成MP4
ffmpeg -i input.flv output.mp4
参数说明:
- -i 指定输入文件名
将FLV格式转成MKV,指定视频编码器为h.264音频编码器为flac
ffmpeg -i input.flv -c:v libx264 -c:a flac video.mkv
参数说明:
- -c 是-codec的简写,-c:v表示视频编码器,-c:a表示音频编码器
拷贝输入文件中的流到输出
ffmpeg -i input.mp4 -c:v libx265 -b:v 1500k -pass 2 -c:a copy output.mp4
参数说明:
- -i input.mp4 指定输入文件
- -c:v libx265 视频编码器使用libx265(即H.265/HEVC)
- -b:v 1500k 视频的目标比特率为1500 kbps
- -pass 2 表示这是两次编码中的第二通道。在第二通道中编码器会利用第一通道收集的统计信息来优化编码
- -c:a copy 音频流不进行重新编码,而是直接从输入文件复制到输出文件
- output.mp4 输出文件名
提取流
提取输入文件中的某个流到输出文件 (eg:提取input.mp4中视频流到输出文件)

提取输入文件中的某个流转码后输出

提取帧
按一定频率提取
//每秒提取10帧(更密集的采样)
ffmpeg -i input.mp4 -r 1 -f image2 image-%3d.jpg
//每10秒提取1帧(稀疏采样)
ffmpeg -i input.mp4 -r 0.1 -f image2 image-%3d.jpg
参数说明:
- image2 是FFmpeg图片序列复用器
- image-%3d.jpg 输出文件名。%d-数字序号(1, 2, 3...), %3d-3位数字,不足补零(001, 002, 003...)
指定时间范围提取
//提取前30秒
ffmpeg -i input.mp4 -r 1 -t 30 -f image2 image-%3d.jpg
//从第10秒开始提取
ffmpeg -i input.mp4 -r 1 -ss 10 -f image2 image-%3d.jpg
//提取从00:01:00开始的30秒
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 output.mp4
//提取从00:01:00到00:02:00
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
按帧类型提取
//提取I帧(关键帧)
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -f image2 keyframe-%3d.jpg
//提取P帧(预测帧)
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,P)" -f image2 pframe-%3d.jpg
//提取B帧(双向预测帧)
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,B)" -f image2 bframe-%3d.jpg
合并流
相同格式合并
要求所有的视频具有相同的编码格式、分辨率、帧率等,否则可能无法正常播放。
//步骤1.创建一个文件(list.txt),列出要合并的所有视频文件, 格式如下:
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
//步骤2.进行合并
ffmpeg -f concat -i list.txt -c copy output.mp4
相同编码合并
//步骤1.将每个视频转换为TS格式(避免容器格式的限制)
ffmpeg -i video1.mp4 -c copy -bsf:v h264_mp4toannexb video1.ts
ffmpeg -i video2.mp4 -c copy -bsf:v h264_mp4toannexb video2.ts
//步骤2.进行合并
ffmpeg -i "concat:video1.ts|video2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
视频流处理
格式转换
查看支持的格式
ffmpeg -formats查询到的可用格式分为两类:
-
D. = Demuxing supported, 非复合格式
-
.E = Muxing supported, 复合格式
ffmpeg -formats
图像缩放
//指定输出图像的宽高进行缩放
ffmpeg -i input.mp4 -vf scale=1280:720 output.jpg
//指定输出图像的高,按原纵横比缩放
ffmpeg -i input.mp4 -vf scale=1280:-1 output.jpg
//指定输出图像的宽,按原纵横比缩放
ffmpeg -i input.mp4 -vf scale=-1:720 output.jpg
//按原纵横比放大n(1,2,3...)倍
ffmpeg -i input.mp4 -vf scale=iw*n:ih*n output.jpg
//按原纵横比缩小n(1,2,3...)倍
ffmpeg -i input.mp4 -vf scale=iw/n:ih/n output.jpg
图像裁剪
指定区域裁剪
ffmpeg -i input.jpg -vf crop=w:h:x:y output.jpg
其中,w是裁剪区域的宽,h是裁剪区域的高,x是基于输入图像的裁剪区域的左顶点x坐标,y是基于输入图像的裁剪区域的左顶点y坐标。
中心区域裁剪
ffmpeg -i input.jpg -vf crop=w:h output.jpg
调整帧率
将输入文件中视频帧率调整为30并输出
ffmpeg -i input.mp4 -r 30 output.mp4

调整比特率
将输入视频比特率调整为1M
ffmpeg -i input.mp4 -b:v 1M output.mp4
