FFmpeg学习笔记
针对音视频的几种情况
1、视频局部裁剪
ffmpeg -i input.mp4 -b:v 2048k -vf crop=828:462:0:665 -ss 1.00 -t 10.00 output.mp4
2、 视频倒放
ffmpeg -i input.mp4 -b:v 2048k -vf reverse output.mp4
3、视频插入图片
ffmpeg -i input.mp4 -b:v 2048k -strict -2 -vf
4、 音视频转化格式
ffmpeg -i input.mp3 -vcodec copy -acodec copy output.wav
ffmpeg -i input.mp4 -vcodex copy acodec copy output.mov
5、 抽取视频的画面
把视频的音频部分去除,只留下视频内容,没有声音
-an : audio no
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
6、抽取视频的音频部分
把视频的音频部分提取出来,生成新的视频, 没有画面,完整,但是提取音频格式会导致音频内容不全
-vn : video no
ffmpeg -i input.mp4 -vn -acodec copy output.mp4
滤镜
-vf 视频 -af 音频
in_w-300 宽度裁减300in_h-200 高度裁减200
crop 格式 crop=out_w:out_h❌y
-c:v 视频
-c:a copy audio不做任何处理
ffmpeg -i input.mp4 -vf crop=in_w-300:in_h-200 -c:v libx264 -c:a copy output.mp4
裁减与合并命令
1、音视频裁减
-i input.mp4 裁减的文件input.mp4
-ss 裁减的开始时间
-t 裁减的时长为多少秒
out.mp4 输出的文件
ffmpeg -i input.mp4 -ss 00:00:00 -t 10s out.mp4
2、音视频合并
inputs.txt 合并的所有文件整合 内容格式 file filename
建议将视频均转化为ts 文件 再合并导出MP4文件
举例 : inputs.txt
file '1.ts'
file '2.ts'
ffmpeg -f concat -i inputs.txt out.mov
图片/视频互转命令
1、视频转图片
-r 转化图片的帧率 -r 1 每秒钟转换出一张图片
-f 将文件转化成什么格式 -f image2图片
image-%3d.jpeg 转化出的图片名称
ffmpeg -i input.mp4 -r 1 -f image2 image2-%3.jepg
2、图片转视频
图片转视频 要求图片的名称开头都要一致,格式一致
ffmpeg -i image2-%3.jepg outVideo.mp4
直播推/拉流
1、直播推流
ffmpeg -re -i output.mp4 -c copy -f flv rtmp://server/live/streamName
2、 直播拉流
拉流生成的文件数据格式 根据流的格式来进行确定
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
示例:
ffmpeg -i http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8 -c copy Apple.m3u8
3、修改视频输出的分辨率
视频编码中一般都会使用常用的几个分辨率:手机拍出来的也都是这几个,他的分辨率宽 > 高,衡量是横竖的就只有 方向这个属性,其他比较骚的方式就不考虑了
所以我们在压缩视频时候拿到分辨率就看它的宽度就好了:
比如我们的目标分辨率为: 1280720,源视频分辨率 19201080,如果视频宽度大于 1280,我们就按照宽度1280进行压缩,高度-1,他会自己计算,朝向我们不用干预,按照源朝向输出就好了:
720P | 1080P | 2k | 4K | |
---|---|---|---|---|
分辨率 | 1280*720 | 1920*1080 | 2560*1440 | 4096*2160 |
画质 | 高清 | 全高清 | 四倍高清 | 超高清 |
宽高比例 | 16:9 | 16:9 | 16:9 | 约等于16:9(17:9) |
-c:v 设置视频video的格式
-c:a 对于视频的音频audio部分不进行更改 copy
ffmpeg -i input.mp4 -c:v libx264 -vf scale=1080:-1 -c:a copy output.mp4
设置视频码率
-b:v /-b 参数解析
在 ffmpeg 命令中 , -b:v 参数 和 -b 参数 的 作用 都是 设置 视频码率 ,
推荐使用 -b:v 参数 设置视频码率 , 参数中的 b 代表 码率 ( bitrate ) , :v 表示该码率参数是针对 视频流 ( Vedio Stream ) 设置的 ;
不推荐使用 -b 参数 , 该参数命令设置不明确 , -b 参数 同时可以用于设置 音频码率 和 视频码率 , 但是通常情况下 默认 设置的是 视频码率 ;
-b:v / -b 参数 值 是 要设置的 输出文件 的 视频 码率值 , 如 : -b:v 1M 参数的作用是 将 视频码率设置为 1 Mbps , Mbps 代表兆比特每秒 ( Megabits per second ) ;
命令 , 将 输入文件 input.mp4 以 1M 的视频码率 输出到 输出文件 output.mp4 中 :
输入文件 input.mp4 的 视频码率为 1580 kb/s , 输出文件 output.mp4 的 视频码率为 1000 kb/s , 视频大小 由 13.1MB 变为 8.16MB ;
ffmpeg -i input.mp4 -b:v 1M output.mp4
命令 , 将 输入文件 input.mp4 以 1M 的视频码率 输出到 输出文件 output.mp4 中 ;
ffmpeg -i input.mp4 -b 1M output.mp4
设置输出视频帧率 -r 参数
在 ffmpeg 命令中 , -r 参数 的 作用是 设置 输出视频 的 帧率 Frame Rate , 帧率是指每秒钟显示的图像帧数 , 单位是 FPS , Frame Per Second ;
通过 -r 参数 可以 控制 输出视频的 播放速度 和 平滑度 , 帧率越高 , 视频越平滑流畅 , 帧率越低 , 视频越卡顿 ;
-r 参数 的 参数值 是 一个具体的帧率值 , 是一个数字 , 一般情况下 取值 0 ~ 120 , 设置 -r 60 参数 , 表示 输出视频的帧率为 60 帧每秒 ;
注意 : -r 参数 设置的是 输出视频的帧率 , 输入视频的帧率是固定的 , 如果 输入视频的帧率 与 该 -r 参数 设置的 输出视频帧率不同 ,
如果 输入视频帧率 > 输出视频帧率 : 通过 丢弃视频帧 来调整输出视频的帧率。
如果 输入视频帧率 < 输出视频帧率 : 通过 增加重复帧 来调整输出视频的帧率。
命令 , 将输入文件 input.mp4 的 视频流 重新编码为 帧率为 60 帧每秒 , 并将结果保存到 output.mp4 文件中 ;
ffmpeg -i input.mp4 -r 40 output.mp4
设置视频画面宽高 -s 参数
-s 参数解析
在 ffmpeg 命令中 , -s 参数 的 作用是 设置 输出视频 的分辨率 , 单位是 像素 ;
-s 参数的 参数值 是 一个宽度和高度的值 , 中间用 x 分隔 , 如 : 如果输出视频的分辨率为 376x210 , 则可以使用 -s 376x210 参数设置 ;
ffmpeg -i input.mp4 -s 1980*1080 output.mp4
设置视频画面宽高比 -aspect 参数
-aspect 参数解析
在 ffmpeg 命令中 , -aspect 参数 的作用是 设置视频画面的宽高比 ;
使用 -aspect 参数时 , 设置的参数值是 一个宽高比的值 , 这个参数值可以是一个
浮点数 : 表示宽度与高度的比值 , 如 : -aspect 0.5 ;
以冒号分隔的两个整数 : 表示宽和高的具体数值 , 如 : -aspect 1:2 ;
命令 , 将输入文件 input.mp4 的 视频流 重新编码为 1:1 的宽高比 , 并将输出结果保存到 output.mp4 输出文件中 ;
ffmpeg -i input.mp4 -aspect 1:1 output.mp4
设置视频编解码器 -vcodec 参数
在 ffmpeg 命令中 , -vcodec 参数 的 作用是 指定 视频编解码器 ;
视频编解码器 是用于 对 视频数据 进行 压缩编码 和 解压缩解码 的算法 , 使用 不同的 编解码器 获得的 视频文件 的 画面质量 / 文件大小 / 兼容性 不同 ;
-acodec 后面的 参数值 是 编解码器的名称 ;
常见的 视频编解码器 包括
libx264 : 用于 H.264 格式的视频编码 ;
libvpx : 用于 VP8 编码 ;
libvpx-vp9 : 用于 VP9 编码 ;
copy : 用于直接复制原始视频流而不进行重新编码 ;
-vcodec 参数设置 libx264 视频编码器:
命令 , 将 input.mp4 输入文件转换为 H.264 编码的视频 输出到 output.mp4 输出文件中 ;
ffmpeg -i input.mp4 -vcodec libx264 output.mp4
-vcodec 参数设置 libvpx-vp9 视频编码器:
命令 , 将 input.mp4 输入文件转换为 VP9 编码的视频 输出到 output.mp4 输出文件中 ;
ffmpeg -i input.mp4 -vcodec libvpx-vp9 output.mp4
设置视频滤镜 -vf 参数
-vf 参数解析
在 ffmpeg 命令中 , -vf 参数 的 作用是 设置 视频滤镜 , 可以对输入的视频流进行各种复杂的图像处理 ;
-vf 参数 的 参数值 通常是 单个滤镜 或 多个由逗号分隔的滤镜链 , 每个滤镜都可以对视频进行特定的变换效果 ;
命令 , 将输入视频 input.mp4 的尺寸调整为 1280x720 像素 , 并输出到 output.mp4 输出文件中
ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
获取音视频图片的宽高
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
打印结果为 宽,高
获取音视频的封面(取第一帧的图片)
ffmpeg -i testDemo.mp4 -ss 00:00:01.000 -vframes 1 -f image2 output_image.jpg