FFmpeg基本功能

官网:https://ffmpeg.org

FFmpeg是一套开源的、跨平台的多媒体解决方案,可以用于录制、转换和流式传输音频和视频。支持Linux、Windows和macOS操作系统。

作为一个强大的多媒体工具集,FFmpeg提供了广泛的功能和工具,使开发者能够进行各种音视频处理任务,例如:

格式转换:通过FFmpeg,您可以将音频和视频从一个格式转换为另一个格式。它支持众多的音视频编解码器,可以处理几乎所有常见的音视频格式。

视频剪辑和裁剪:您可以使用FFmpeg裁剪视频,提取所需的片段,并且还可以调整视频的大小、分辨率和帧率等参数。

音频处理:FFmpeg可以对音频文件进行各种处理,包括音频合并、分割、混音、音量调节、降噪等。

视频处理:除了转码和剪辑,FFmpeg还支持视频滤镜和特效,如添加水印、旋转、缩放、色彩调整等。

视频流式传输:使用FFmpeg,您可以将音视频实时流式传输到网络上,以便通过网络播放、直播或其他实时应用。

FFmpeg提供了命令行工具,也可以通过C/C++的库进行集成。此外,还有许多基于FFmpeg的第三方工具和框架可用,使得音视频处理变得更加简单和便捷。

ffmpeg将mp4视频文件切割成m3u8关联的ts文件

`ffmpeg -i input.mp4 -c:v libx264 -c:a copy -f hls -hls_time 15 -hls_list_size 0
-hls_start_number 0 output.m3u8`

-hls_time n: 设置每片的长度,默认值为2。单位为秒
-hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5
-hls_start_number n:设置播放列表中sequence number的值为number,默认值为0
-hls_wrap n:设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0。这个选项能够避免在磁盘上存储过多的片,而且能够限制写入磁盘的最多的片的数量
-i input.mp4: 这是输入文件,即你想要处理的视频文件。
-c copy: 这意味着不对视频或音频进行重新编码,而是直接复制。这样可以更快地完成操作,但前提是你的输入和输出格式必须是兼容的。
-map 0: 这表示从输入文件中选择所有的流(视频、音频、字幕等)。
-f hls: 这指定了输出格式为HLS

`ffmpeg -i input.mp4 -fflags flush_packets
-max_delay 2 -flags -global_header
-hls_time 5 -hls_list_size 0 -vcodec libx264 -acodec aac -r 30 -g 60 index.m3u8`

合并MP4视频
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[outv]" -map "[outv]" -strict -2 output.mp4

-filter_complex 选项后的内容指示FFmpeg执行复杂的过滤操作。在这里,我们使用了concat过滤器来将两个视频文件连接在一起。
[0:v] 和 [1:v] 是视频流的输入标签,表示要连接的第一个和第二个视频文件。
concat=n=2:v=1:a=0[outv] 部分定义了连接的方式:n 表示输入的文件数,v 表示只连接视频流,a 表示不包括音频流,[outv] 是输出标签。
-map "[outv]" 用于将输出的视频流映射到输出文件。
-strict -2 用于确保兼容性。

远程文件
ffmpeg -i "https://xushanxiang.com/demo/ffmpeg/hls265/output.m3u8" -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4

cmd合并
copy /b F:\f\*.ts E:\f\new.ts
copy /b F:\f\*.ts E:\f\new.MP4

php截取视频封面
composer require php-ffmpeg/php-ffmpeg
https://github.com/PHP-FFMpeg/PHP-FFMpeg/

效率优化版,提升效率

1.视频整体转码ts
ffmpeg -y -i music.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out\music.ts

  1. ts 文件切片
    ffmpeg -i music.ts -c copy -map 0 -f segment -segment_list out\music.m3u8 -segment_time 10 out\15s_%3d.ts

hls_time 切片时间不准确的问题
播放 m3u8 的 ts 切片,必须要完整的下载一个 ts 切片,才能够播放,设置hls_time 的时间间隔越短越好( 根据实际情况来 ),实际过程中设置切片时间间隔为 2 秒,调用如下指令:

ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 2 index.m3u8
但没有按照参数输入,进行切片。

原因:ts 文件的切割,还跟原文件视频的 GOP 大小有关系(也就是两个 I 帧之间的时间间隔),因为任何一个 ts 分片第一帧必须是I帧,否则无法最快播放,并且第一帧不是 I 帧,对于播放器也是没有任何的意义,直接被播放器扔掉。任何一个视频流必须在获取到第一个I帧才能成功解码出图片。虽然指定了 1 秒切割一个 ts 文件,实际上,由于原视频流可能好几秒才有一个 I 帧,所以必须等到下一个 I 帧,才会重新开始切片。

解决:既然知道要1秒产生一个ts分片,那就必须产生切片的过程中,强制一秒中产生一个关键帧。设置关键帧间隔,设置间隔为 2 秒的参数如下:-force_key_frames "expr:gte(t,n_forced*2)"

完整指令如:ffmpeg -i test.mp4 -force_key_frames "expr:gte(t,n_forced*2)" -strict -2 -c:a aac -c:v libx264 -hls_time 2 -f hls index.m3u8

m3u8文件格式
完整的 m3u8 文件有三部分:

index.m3u8,保存视频的基本信息和分段文件顺序;
key,如果视频加密,保存密钥;
data文件,其他都是视频的数据文件。

具体内容解析:

#EXTM3U,是文件开始
#EXT-X-VERSION,标识HLS的协议版本号;
#EXT-X-TARGETDURATION,表示每个视频分段最大的时长(单位秒);
#EXT-X-MEDIA-SEQUENCE,表示播放列表第一个 URL 片段文件的序列号;
#EXT-X-PLAYLIST-TYPE,表明流媒体类型;
#EXT-X-KEY,加密方式,这里加密方式为AES-128,同时指定IV,在解密时需要;
#EXTINF,表示其后 URL 指定的媒体片段时长(单位为秒)。

指定码率转换

ffmpeg -i input.mp4 -b:v 10M -b:a 10M -c:v libx264 -c:v aac out.mp4

备注:切记一点,命令行中涉及编解码时,-c:v copy 不要使用,否则 比如指定的码率参数,分辨率参数
等就会失效,而且很难找到原因
-b:v 10M 指定视频重新编码的码率为10M/s
-b:a 10M 指定音频重新编码的码率为10M/s

指定时间段录制
ffmpeg -i input.mp4 -c:v copy -c:a copy -ss 00:10:20 -to 00:30:20 out.mp4

指定录制时长
ffmpeg -i input.mp4 -c:v copy -c:a copy -t 30 out.mp4
备注: -t 30 表示指定30秒的录制时长

提取h264 裸码流
ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264

播放h264 裸码流
ffplay -stats -f h264 out.h264
ffplay -i out.h264

提取aac 裸码流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
备注:-vn (disable video)

播放aac 裸码流
ffplay -i out.aac

视频倒放,音频不变
ffmpeg -i input.mp4 -vf reverse input_video_reversed.mp4

音频倒放,视频不变
ffmpeg -i input.mp4 -map 0 -c:v copy -af "areverse" input_audio_reversed.mp4

视频音频同时倒放
ffmpeg -i input.mp4 -vf reverse -af areverse input_reversed.mp4

提取h264 裸码流(指定编码质量)
ffmpeg -i input.mp4 -an -c:v libx264 -crf 18 out.h264

备注: -an (disable audio)
-c:v libx264(等价于 -vcodec h264 或 -vcodec libx264)
-crf 18 (固定质量值18)

转码->AVC(指定转码的部分参数)
ffmpeg -i input.mp4 -c:v libx264 -preset slow -tune film -profile:v main out.mp4

备注:-tune film (主要配合视频类型和视觉优化的参数)
-preset slow 编码预设,主要调节 编码速度和质量的平衡 10个选项如下 从快到慢:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo
-profile:v main
h264有四种画质级别,分别是baseline, extended, main, high:
1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced), 也支持CAVLC 和CABAC 的支持;
4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

转码->HEVC
ffmpeg -i input.mp4 -c:v libx265 -c:a copy out.mp4

转码->AVC(指定转码的部分参数)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2048k -vf scale=1280:-1 -y out.mp4

备注:-vf scale=1280:-1 (指定输出视频的宽高,高-1代表按照比例自动适应)
-b:v 2048k(指定输出视频的码率,即输出视频每秒的bit数)

查看当前支持的编码器
ffmpeg -codecs
查看当前支持的封装格式
ffmpeg -formats
查看当前支持的滤镜
ffmpeg -filters

使用指定解码器播放视频
ffplay -vcodec h264 -i out.mp4

查看指定解码器的相关参数
ffmpeg -h decoder=h264_cuvid

查看当前支持的硬件加速选项
ffmpeg -hwaccels
例如:mac核显支持的选项(videotoolbox)英伟达显卡支持的选项(cuvid)

使用cuvid进行解码和编码实现转码
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -vf scale=1280:-1 -y out.mp4

备注: -hwaccel cuvid (指定使用cuvid硬件加速)
-c:v h264_cuvid (使用h264_cuvid进行视频解码)
-c:v h264_nvenc (使用h264_nvenc进行视频编码)
-b:v 2048k (指定输出视频的码率,即输出视频每秒的bit数)
-vf scale=1280:-1 (指定输出视频的宽高,高-1代表按照比例自动适应)

使用videotoolbox进行编码实现转码
ffmpeg -i input.mp4 -vcodec h264_videotoolbox -b:v 2048k -vf scale=1280:-1 -y out.mp4

备注:-vcodec h264_videotoolbox (使用h264_videotoolbox 进行视频编码)
-b:v 2048k (指定输出视频的码率,即输出视频每秒的bit数)
-vf scale=1280:-1 (指定输出视频的宽高,高-1代表按照比例自动适应)

Tags: 笔记

添加新评论