FFmpeg常用操作

目录

网络流操作

[推流(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
相关推荐
给大佬递杯卡布奇诺3 小时前
FFmpeg 基本数据结构 AVCodecContext分析
数据结构·c++·ffmpeg·音视频
mortimer1 天前
用PySide6 构建一个响应式视频剪辑工具:多线程与信号机制实战
python·ffmpeg·pyqt
aqi002 天前
FFmpeg开发笔记(八十六)基于Node.js的国产视频编辑开源框架OpenCut
ffmpeg·音视频·直播·流媒体
叶羽西2 天前
FFmpeg介绍、使用说明
ffmpeg
aqi003 天前
FFmpeg开发笔记(八十五)基于PyQt和FFmpeg的开源视频剪辑器OpenShot
ffmpeg·音视频·直播·流媒体
戴草帽的大z4 天前
交叉编译FFmpeg:从x264到RK3588部署实战
linux·ffmpeg·rk3588·h.264·aarch64
农民搬运工4 天前
用 ffmpeg 命令去除视频的重复帧、剪视频、修改视频尺寸
ffmpeg·视频去除重复帧·用ffmpeg剪视频·用ffmpeg去除重复帧·用ffmpeg改视频尺寸
plmm烟酒僧4 天前
RK3588 使用 FFmpeg 硬件解码输出到 DRM Prime (DMA Buf) 加速数据传输
ffmpeg·rk3588·h.264·瑞芯微·硬件解码·rga
十秒耿直拆包选手4 天前
OS:使用ffmpeg从视频文件提取音频文件
ffmpeg