ffmpeg
安装
- 源码安装 git clone https://git.ffmpeg.org/ffmpeg.git
- 配置 编译 安装
bash
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --disable-static --disable-x86asm --enable-ffplay
make -j`nproc` && make install
Q: 没有ffplay
A:安装 yum install libsdl2-dev -y
bash
yum update
yum install SDL2 SDL2-devel
- 配置环境变量
Q: 缺少动态库
A: echo "/usr/local/ffmpeg/lib" >> /etc/ld.so.conf + ldconfig
命令
1. 视频转换为图片
ffmpeg -i test.mkv -r 1 -f image2 pic/image%3d.jpg
-
-i test.mkv
:指定输入文件test.mkv
,这是你要从中提取帧的视频文件。 -
-r 1
:设置帧率为每秒 1 帧。这意味着 FFmpeg 每秒从视频中提取一帧图像。你可以根据需要调整此参数,例如设置为 2 表示每秒提取两帧。 -
-f image2
:指定输出格式为image2
,这是 FFmpeg 用于处理图片序列的格式。 -
pic/image%3d.jpg
:指定输出图片的文件路径和命名模式。%3d
表示使用三位数字的文件名(例如image001.jpg
、image002.jpg
等)。pic/
是输出图片的存放目录。
2. 将图片按顺序合并成视频
ffmpeg -r 25 -f image2 -i pic/image%3d.jpg -vcodec libx264 -s 1920x1080 -g 1 -keyint_min 1 -sc_threshold 0 -pix_fmt yuv420p output.mp4
-r 25
:指定视频的帧率为每秒 25 帧。这意味着每秒钟将显示 25 张图片。-f image2
:指定输入格式为图片序列。image2
是 FFmpeg 处理图片序列的格式。-i pic/image%3d.jpg
:指定输入图片文件的路径和命名模式。%3d
表示使用三位数字的文件名(例如,image001.jpg
、image002.jpg
等)。-vcodec libx264
:指定使用 H.264 编解码器进行视频编码。-s 1920x1080
:设置输出视频的分辨率为 1920x1080。-g 1
:设置 GOP(Group of Pictures)大小为 1。这表示每一帧都是关键帧,适合于某些特定应用场景(如视频流的实时预览),但可能会导致更大的文件大小。-keyint_min 1
:指定最小关键帧间隔为 1 帧。配合-g 1
使用,确保每一帧都是关键帧。-sc_threshold 0
:设置场景变化阈值为 0。场景变化阈值为 0 表示无论是否检测到场景变化,FFmpeg 都会尝试在每一帧设置关键帧。-pix_fmt yuv420p
:指定像素格式为 YUV 4:2:0。这是常见的视频像素格式,兼容性良好。
3. 捕获摄像头
ffmpeg -list_devices true -f dshow -i dummy
-list_devices true
:此选项用于指示 FFmpeg 列出所有可用的设备,而不是实际捕获或处理媒体流。-f dshow
:指定输入格式为 DirectShow。DirectShow 是 Windows 平台上的多媒体框架,用于捕获和处理音视频数据。-i dummy
:提供一个虚拟的输入文件名dummy
。这个参数的目的是为了满足 FFmpeg 的输入要求,但实际上并不使用这个虚拟输入。
ffmpeg -f dshow -i video="Camera 1" -t 10 output.mp4
"Camera 1"
是你从 -list_devices
命令中获得的视频设备名称,-t 10
表示录制 10 秒钟的视频。
4. 捕获桌面,推流到流媒体服务器
ffmpeg -f gdigrab -framerate 30 -i desktop -f rtsp rtsp://192.168.0.103/live/streamkey
-
-f gdigrab
:指定输入格式为gdigrab
。这是 Windows 上用于捕获桌面内容的输入格式。如果你使用的是其他操作系统,可能需要使用不同的输入格式。 -
-framerate 30
:设置捕获的帧率为 30 帧每秒。你可以根据需要调整这个值,通常 30 帧每秒是比较常见的选择。 -
-i desktop
:指定输入来源为桌面。这告诉 FFmpeg 从整个桌面捕获视频。 -
-f flv
:指定输出格式为 FLV,这是一种常用于视频流的格式。许多流媒体服务器和平台(如 YouTube、Twitch)都支持这种格式。 -
rtmp://your.streaming.server/live/streamkey
:指定流媒体服务器的 URL 和流密钥。你需要将其替换为你的实际服务器地址和流密钥。例如,对于 YouTube,你可以在 YouTube 的直播设置中找到这个信息。
使用ffplay拉流
ffplay -i rtsp://192.168.0.103/live/streamkey
ffmpeg -i rtsp://your.rtsp.server/live/stream -c copy output.mp4
ffmpeg -i rtsp://your.rtsp.server/live/stream -c:v libx264 -c:a aac output.mp4
ffmpeg -rtsp_transport tcp -i rtsp://your.rtsp.server/live/stream -c copy output.mp4
-i rtsp://your.rtsp.server/live/stream
:指定 RTSP 服务器的 URL 作为输入源。-c copy
:直接拷贝视频和音频流,而不进行转码,这样可以保持原始质量并提高处理速度。output.mp4
:保存拉取到的流的文件名和格式。在这里是 MP4 格式,你可以根据需要更改文件名和格式。- 如果你需要将流转码为不同的格式或编码,你可以使用
-c:v
和-c:a
参数 - 用
-rtsp_transport tcp
强制使用 TCP 传输协议,这可以改善在不稳定网络条件下的流稳定性