FFmpeg基本组成

  • AVFormat

    封装了大多数媒体格式:如MP4、FLV等文件格式,RTMP、RTSP、MMS、HLS等网络协议。

  • AVCodec

    支持常见编解码格式:MPEG4、AAC等。支持第三方:

    • H.263(AVC)->需x264编码器;
    • H265(HEVC)->需x265编码器;
    • MP3(mp3lame)->需libmp3lame编码器;
  • AVFilter

    通用滤镜处理框架。可以有多个输入和多个输出。

ffmpeg -i 1.jpg -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip];[main][flip] overlay=0:H/2" 2.jpg

说明:

  1. 相同的Filter线性链之间用逗号分隔
  2. 不同的Filter线性链之间用分号分隔
  3. 方括号[]括起来的部分是标签
  4. 上面的命令行,图片换成视频也可以正常转换,比如 1.jpg 改为 1.mp4, 2.jpg 改为 2.mp4
  • AVDevice

  • AVUtil

  • swresample

    音频转换计算模块

  • swscale

    视频图像转换计算模块

编解码工具 ffmpeg.exe

ffmpeg -i 1.mp4 2.avi
  • -i 参数将1.mp4作为输入源
  • mp4和avi是两种文件封装格式,但不是后缀名就可以决定的。
ffmpeg -i 1.mp4 -f avi 2.dat
  • -f进行约束,指定了输出文件的容器格式,其过程和上一个命令一样,仅仅输出的文件名不同。

ffmpeg.exe的工作流程

  1. ffmpeg读取输入源文件
  2. 将音视频包Demuxer(解封装),调用libavformat中的接口即可
  3. Decoder(解码)每一帧音视频数据,成为YVU或者PCM这样的数据,通过libavcodec中的接口即可
  4. 转换参数
  5. Encoder(编码)对应数据,依然通过libavcodec中的接口来实现
  6. 然后通过libavformat中的接口进行Muxer(封装)
  7. 输出到目标,文件或数据流

可以通过下面的命令查看默认支持格式

ffmpeg -formats

查看支持的编解码情况

ffmpeg -codecs
ffmpeg -encoders
ffmpeg -decoders Decoders:
V..... = Video
A..... = Audio
S..... = Subtitle
.F.... = Frame-level multithreading
..S... = Slice-level multithreading
...X.. = Codec is experimental
....B. = Supports draw_horiz_band
.....D = Supports direct rendering method 1

输出信息的第一列包含6个字段:

  1. 表示这个编码器是视频、音频还是字幕;
  2. 表示帧级别的多线程支持;
  3. 表示分片级别的多线程支持;
  4. 表示为试验版本;
  5. draw_horiz_band模式支持;这是一个数据结构;
  6. 直接渲染模式支持;

查看支持哪些滤镜

ffmpeg -filters

查看flv解封装器的参数支持

ffmpeg -h demuxer=flv

查看H.264的编码器的参数支持

ffmpeg -h encoder=h264

查看过滤器的参数支持

ffmpeg -h filter=colorkey

播放器 ffplay.exe

这个一般我们用来做测试工具

多媒体分析器 ffprobe

ffprobe -show_streams 1.mp4

附加一个小例子

ffmpeg -i 2.avi -vcodec mpeg4 -b:v 200k -r 15 -an 15.mp4

说明:

  • 参数b为音频和视频的码率,可以认为是两者加起来的码率。默认200kbit/s

    可以工具b:v设置视频码率,b:a设置音频码率
  • 参数r为视频帧率fps
  • 参数an,转码后的文件不包括音频

改变分辨率

ffmpeg -i 1.mp4 -vf scale=320:240 2.mp4

最新文章

  1. CRL快速开发框架系列教程八(使用CRL.Package)
  2. 【发布】工业串口和网络软件通讯平台(SuperIO v2.2.4)
  3. Linux中可用于管道操作的命令总结
  4. 03.Hibernate一对多关联
  5. FreeModbus Slave RTU 精简版源代码【worldsing 笔记】
  6. sjtu1590 强迫症
  7. 专门讲讲这个MYSQL授权当中的with grant option的作用
  8. 学习Android之SharedPreferences使用
  9. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)
  10. hdu5925 Coconuts
  11. revit二次开发addin文件
  12. Java调用C/C++实现的DLL动态库——JNI
  13. 关于博主noble_
  14. [转]使用RTT(Real-Time Terminal)
  15. 看图说话:关于BI那点事儿
  16. linux 的空命令:(冒号)
  17. rpm包管理和源码包管理
  18. 实验吧之损坏的U盘
  19. 使用java画一张海报
  20. 分层图 (可以选择K条路的权为0,求最短路)

热门文章

  1. 【Linux】fio测试读写速度
  2. 2021 Duilib最新入门教程(一)Duilib简介
  3. 带你走进memcache,老牌内存缓存技术
  4. hello2 部分代码解析
  5. Android 代码规范大全
  6. 一个简单的IM聊天程序Pie IM(以后会更新)
  7. Redis二进制安全
  8. ospf-lite runs over tcp / udp port 8899.
  9. maven打包三种方式
  10. Coded UI