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

这样一下子就轻很多。

相关推荐
程序员老陆4 分钟前
C++ 未定义行为全景:对象模型、优化边界与工程防御
开发语言·c++·程序设计
小小龙学IT1 小时前
Go 语言 cgo 与 C/C++ 互操作深度解析:从 fwlib 直连到工业数采网关实战系列
c语言·c++·golang
程序员老陆3 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
某不知名網友3 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈3 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
大鹏说大话3 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list
JMchen3 小时前
性能优化——让Native代码飞起来
android·c++·性能优化
chenbingjie_c4 小时前
手撕 C++ priority_queue:二叉堆 + 模板仿函数 + 模板特化(保姆级逐函数拆解)
开发语言·c++
小小龙学IT4 小时前
C++ Redis 客户端深度解析(hiredis 与 redis-plus-plus)——工业数采实时缓存 C++ 侧实战
c++·redis·缓存
垆边人似月.4 小时前
华为机试题 :最长递增子序列题目
数据结构·c++·算法·华为