环境:centos7.6
最近痴迷于FFmpeg切片,由于CentOS没有官方FFmpeg rpm软件包,我们需要借助第三方YUM源(Nux Dextop)来安装。
首先安装第三方 Nux Dextop Yum 源
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
接着安装FFmpeg 和 FFmpeg
sudo yum install ffmpeg ffmpeg-devel -y
测试
查看安装信息
ffmpeg
查看帮助文档
ffmpeg -h
查看支持容器
ffmpeg -formats
查看支持编码格式
ffmpeg -codecs
查看已安装编码器
ffmpeg -encoders
获取媒体文件时长
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 <File>
获取媒体文件大小
ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 <File>
获取媒体文件比特率
ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 <File>
获取视频文件编码
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 <File>
视频文件直接切片
ffmpeg -i <File> -vcodec copy -acodec aac -bsf:v h264_mp4toannexb -map 0 -f segment -segment_list output.m3u8 -segment_time 10 output_%03d.ts
M3U8合成视频文件
ffmpeg -allowed_extensions ALL -i "meida.m3u8" -c copy "media.mp4"
分片时长计算(VBR, 大约)
#分片时间 = (文件限制大小[M] * 1024 * 1024) / (媒体文件比特率[b] * 突发码率比率 / 8)
#突发码率比率: 1.35 (视情况取值, 大于等于1)
#字幕格式转换(webvtt.org)
更多文档参见:https://www.ffmpeg.org/documentation.html
#主要参数
-i 设定输入流
-f 设定输出格式
-ss 开始时间
#视频参数
-b 设定视频流量(码率),默认为 200Kbit/s
-r 设定帧速率,默认为 25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
#音频参数
-ar 设定采样率
-ac 设定声音的 Channel 数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
#制作 M3U8 视频
#先用 ffmpeg 把 abc.mp4 文件转换为 abc.ts 文件
ffmpeg -y -i abc.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb abc.ts
#再用 ffmpeg 把 abc.ts 文件切片并生成 playlist.m3u8 文件,5 秒一个切片
ffmpeg -i abc.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 abc%03d.ts
#为视频添加 logo
ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
#将输入的 1920x1080 缩小到 960x540 输出
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
#抓取视频的一些帧,存为 jpeg 图片
#-r 表示每一秒几帧
#-q:v 表示存储 jpeg 的图像质量,一般 2 是高质量。
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示开始时间
-t 表示共要多少时间。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
#FFMPEG 截取视频中的图片作为封面
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr -vf fps=fps=1/600 out%02d.jpg
#FFMPEG 截取指定时长的视频
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
#常用
ffmpeg -i foo.mp4 -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_list out.m3u8 -segment_time 10 out%03d.ts