FFmpeg编码封装流程骨架

前言

各种api,流程,比如编码流程需要什么参数,调用什么api都记不住,很正常,我也记不住,记住一下4条骨架即可

1. 视频编码骨架

复制代码
准备编码器
准备目标帧
输入裸数据
做格式转换
设置 pts
send_frame
receive_packet

流程例如:

复制代码
BGRA -> YUV420P -> H.264 packet

2. 音频编码骨架

复制代码
准备编码器
准备重采样器
输入 PCM
做格式转换/重采样
设置 pts
send_frame
receive_packet

例如:

复制代码
PCM S16 -> FLTP -> AAC packet

3.封装骨架

复制代码
创建输出容器
添加视频流
添加音频流
写 header
写 packet
写 trailer

也就是:

复制代码
packet -> MP4

4. 调度同步骨架

复制代码
打开音视频输入
比较当前音频时间和视频时间
谁落后先处理谁
最后 flush

也就是:

cpp 复制代码
谁慢补谁

参数也不要散着记

觉得会乱,是因为你在脑子里觉得参数太碎。

其实它们可以分成 3 组:

输入参数

描述裸流原料是什么:

  • 视频:width height fps in_pix_fmt
  • 音频:sample_rate channels in_sample_fmt

编码目标参数

描述你想压成什么:

  • 视频:out_pix_fmt bitrate
  • 音频:out_sample_fmt bitrate

时间参数

决定同步怎么走:

  • 视频:time_base = 1/fps
  • 音频:time_base = 1/sample_rate
  • 视频 pts:按帧加
  • 音频 pts:按采样数加

你以后看到参数,不要一个个散着记,而是先问:

  • 这是描述输入原料的?
  • 这是描述编码目标的?
  • 还是描述时间线的?

这样脑子就不会乱。

API 记不住怎么办

很简单,分层记,不要平铺记。

你只先记每层最核心的 2~3 个:

视频层

  • sws_scale
  • avcodec_send_frame
  • avcodec_receive_packet

音频层

  • swr_convert
  • avcodec_send_frame
  • avcodec_receive_packet

封装层

  • avformat_write_header
  • av_interleaved_write_frame
  • av_write_trailer

调度层

  • 不用记 FFmpeg API
  • 只记逻辑:比较 video_time / audio_time

这样一下子就轻很多。

相关推荐
QiLinkOS3 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
Irissgwe3 小时前
c++11(lambda表达式与包装器、线程库)
c++·c++11·lambda表达式·线程库·包装器·互斥量库·条件变量库
Peter·Pan爱编程4 小时前
14. Lambda 表达式:随手可写的函数对象
c++·算法·ai编程
不想写代码的星星5 小时前
从分支预测角度看 C++:为什么你的热循环慢得离谱?
c++
郝学胜-神的一滴5 小时前
Qt 高级开发 018:复刻经典登录界面布局与窗口美化全解析
开发语言·c++·qt·程序人生·用户界面
郝亚军5 小时前
IEEE 754 单精度浮点的SEM表示
开发语言·c++·算法
Yyyyyy~7 小时前
【C++】数组篇
开发语言·c++
qq_333120977 小时前
C++高并发内存池的整体设计和实现思路_C 语言
java·c语言·c++
牛肉在哪里7 小时前
ros2 从零开始27 编写广播C++
开发语言·c++·机器人
Curvatureflight7 小时前
前端国际化 i18n 落地实践:语言包、动态文案和格式化问题怎么处理?
前端·c++·vue