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
相关推荐
大大祥16 小时前
Android FFmpeg集成
android·ffmpeg·kotlin·音视频·jni·ndk·音视频编解码
好多渔鱼好多16 小时前
【流媒体】FFmpeg技术介绍与构建方法
ffmpeg
没有羊的王K16 小时前
下载安装FFmpeg教程
ffmpeg
kkoral17 小时前
【FFmpeg 智慧园区场景应用】1.实战命令清单
ffmpeg
天虎17 小时前
使用VS2019编译ShiftMediaProject版本FFmpeg
ffmpeg
kkoral18 小时前
【FFmpeg 智慧园区场景应用】2.自动化处理 Shell 脚本
运维·ffmpeg·自动化
代码煮茶君1 天前
FFmpeg 音视频转码全攻略:参数详解与实战指南
ffmpeg·音视频
深念Y2 天前
录屏意外中断的视频修复软件 untrunc
ffmpeg·文件·视频·录屏·软件·修复工具·untrunc
Black蜡笔小新2 天前
国标设备如何在EasyCVR视频汇聚平台获取RTSP/RTMP流?
网络·ffmpeg·音视频
lcyw3 天前
GB28181: 使用ffmpeg编码h264为ps流
ffmpeg