【音视频】FFmpeg

FFmpeg 学习

  • FFmpeg
    • FFmpeg简介
    • FFmpeg的基本组成
    • FFmpeg的可执行文件
    • ffmpeg 常用命令
    • FFmpeg转码
      • MP4格式
      • MP4概述
    • 音视频文件音视频流抽取
    • H.264常见参数
  • 练手任务
    • 自己生成一些视频,使用scale、overlay等filter
      • 给视频加上快手logo
      • 视频画中画
    • 学会将视频抽帧成若干图片
    • 将视频转成动图(webp,gif)
    • 将视频某帧抽帧成图片并加上水印
  • ffprobe命令
      • 1.简介
      • 2.常用参数

FFmpeg

FFmpeg简介

使用的版本4.3.1
FFmpeg 是一个开放源代码的自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。 “FFmpeg”这个单词中的“FF”指的是“Fast Forward”。

FFmpeg的基本组成

FFmpeg的封装模块AVFormat
FFmpeg的编解码模块AVCodec
FFmpeg的滤镜模块AVFIlter
FFmpeg的视频图像转换计算模块swscale
FFmpeg的音频转换计算模块swresample

FFmpeg的可执行文件

编解码工具ffmpeg
播放器 ffplay
多媒体分析器ffprobe

ffmpeg 常用命令

FFmpeg 常用的命令行参数如下。

-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。

补充
【音视频】FFmpeg_第1张图片

视频参数
【音视频】FFmpeg_第2张图片
音频参数
【音视频】FFmpeg_第3张图片

ffmpeg -encoders 可以查看ffmpeg是否支持H.264编码器

FFmpeg转码

MP4格式

MP4视频文件封装格式是基于QuickTime容器格式定义的,因此参考QuickTime的格式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器,几乎可以用来描述所有的媒体结构,MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。同时,MP4也支持流媒体。MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。MP4格式的官方文件后缀名是“.mp4”,还有其他的以mp4为基础进行的扩展或者是缩水版本的格式,包括:M4V, 3GP, F4V等。

MP4概述

MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。

音视频文件音视频流抽取

FFmpeg 抽取音视频文件中的 AAC 音频流
ffmpeg -i input.mp4 -vn -acodec copy output.aac

FFmpeg 抽取音视频文件中的 H.264 视频流
ffmpeg -i input.mp4 -vcodec copy -an output.h264
-vcodec copy 保持原样不动

H.264常见参数

1.编码预设器preset
【音视频】FFmpeg_第4张图片

#例子
#-b:v 是视频比特率
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4


ffmpeg -i input.mp4 -vcodec libx264 -preset medium -b:v 2000k output.mp4

2.编码优化参数tune
可以包含几个场景film,animation,grain,stilllimage,psnr,ssim,fastdecode,zerolatency
具体区别待整理
在使用FFmpeg与H。264直播编码并推流时,只用tune参数的zerolatency将会提升效率,因为其降低了编码导致的时延。
3.H.264的profile与level设置
profile包含
Baseline,Extented,Main,High,High10,High422,High444
4.控制场景切换关键帧插入参数sc_threshold
5.设置x264内部参数x264opts
6.CBR恒定码率设置参数nal-hrd

练手任务

我的文件夹拥有的内容
推荐视频学习链接
https://www.bilibili.com/video/BV1Ft411s7Xa?p=9
【音视频】FFmpeg_第5张图片

自己生成一些视频,使用scale、overlay等filter

给视频加上快手logo

ffmpeg -i teat.mp4 -i kuaishou.jpg -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=20:y=20" res.mp4

结果

关于上面-filter_complex的理解我找了一篇博客

https://www.jianshu.com/p/b30f07055e2e

视频画中画

ffmpeg -re -i test.mp4 -vf "movie=test2.mp4,scale=480:320[test]; [in][test]overlay [out]" -vcodec libx264 output.mp4

结果

学会将视频抽帧成若干图片

ffmpeg -i test.mp4 -ss 5 -vframes 1 res2.jpg

结果
【音视频】FFmpeg_第6张图片

将视频转成动图(webp,gif)

 ffmpeg -i test3.mp4 -ss 5 -to 8 -s 320:640 -r 15 res.gif

【音视频】FFmpeg_第7张图片

将视频某帧抽帧成图片并加上水印

ffmpeg -i img.jpg -vf "movie=res2.jpg,scale=250:250[logo];[in][logo]overlay[out]" res5.jpg

ffprobe命令

1.简介

ffprobe [OPTIONS] [INPUT_FILE]

官网 https://ffmpeg.org/ffprobe.html#toc-Stream-specifiers-1
官网关于这个的介绍很详细,有需要的话,我以后再将博客中的内容更新的更细致

2.常用参数

-show_format            显示输入多媒体流的容器格式信息
-show_streams           显示输入多媒体流中每一个流的信息
-i input_file           指定输入文件
-print_format json      json 形式输出
-of 或者 -print_format  default/compact/csv/flat/ini/json/xml

命令

./ffprobe -print_format json -show_format -show_streams -i ./video/c.ts
-print_format json 以 json 格式输出 , 
-show_format 输出封装格式信息 ,
-show_streams 输出流信息,
-i ./video/c.ts 输入文件

你可能感兴趣的:(音视频)