FFmpeg 推流到底做了什么?从 avformat_open_input 到 av_write_frame 的完整链路拆解
目录一、先给结论推流只有 4 个阶段二、完整调用流程标准 RTMP 推流版Step 0全局一次程序生命周期Step 1打开“输入源”文件 / 设备Step 2创建输出上下文推流核心Step 3为输出创建 AVStream非常关键Step 4打开 IO真正开始 TCP / RTMP HandshakeStep 5写 HeaderMetadata / FLV Tag / SPS/PPSStep 6主循环 —— 读 Packet → 时间戳 → 写出去6.1 读 Packet6.2 重算时间戳90% 推流问题在这里6.3 发送 Packet真正 push6.4 限速模拟实时Step 7写尾优雅断流三、最小函数调用清单四、推流常见翻车Top31. 不改 time_base2. 用 MP4 当推流格式3. 编码参数没继承全五、一句话工程总结觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。由于能力水平有限文中的错误或不严谨的地方在所难免还请批评指正。Fmpeg 推流本质是mux 时间戳 网络 IO不是编码活。核心链路就三步先avformat_network_init()再开输入拿AVStream用avformat_alloc_output_context2(flv)建输出avformat_new_stream()拷贝codecpar别忘extradata和time_baseavio_open()起 TCP/RTMP 握手接着avformat_write_header()写 Metadata/SPS-PPS主循环里av_read_frame()读包必须av_packet_rescale_ts()重算时基再用av_interleaved_write_frame()往出扔最后av_write_trailer()收尾。90% 的坑都在不改 time_base、用 MP4 推流、首帧非 keyframe。记住一句推的是 AVPacket调的是时间戳header 写成功才算上线。很多人第一次用 FFmpeg 推 RTMP / RTSP / SRT都是抄一条命令ffmpeg -re -i test.mp4 -c copy -f flv rtmp://xxx/live/stream然后一写代码就懵到底要调哪些函数顺序能不能乱为什么要 avformat_write_header这篇就用“推流视角”把 FFmpeg 的 API 调用链捋清楚不啰嗦按时间线来。一、先给结论推流只有 4 个阶段准备输入 ↓ 打开输出AVFormatContext *ofmt_ctx ↓ 构造输出流AVStream codecpar ↓ 写头 / 循环送 AVPacket / 写尾核心函数其实不到 10 个。二、完整调用流程标准 RTMP 推流版下面假设你已经有一个本地文件 / 摄像头 / 解码后帧源目标是rtmp://server/app/stream。Step 0全局一次程序生命周期avformat_network_init(); // RTMP/RTSP/UDP 必调很多 bug 的根源忘了这句RTMP 连不上还不报错。Step 1打开“输入源”文件 / 设备AVFormatContext *ifmt_ctx nullptr; avformat_open_input(ifmt_ctx, input_file, nullptr, nullptr); avformat_find_stream_info(ifmt_ctx, nullptr);目的拿到AVStream拿到codecpar宽高、codec_tag、bitrate、time_base如果是“自己造帧推流”采集→编码这步跳过后面手动建流。Step 2创建输出上下文推流核心AVFormatContext *ofmt_ctx nullptr; avformat_alloc_output_context2(ofmt_ctx, nullptr, flv, rtmp_url);重点flv→ RTMP 必须URL 决定 muxerrtmp:// → librtmp / native等价命令行-f flvStep 3为输出创建 AVStream非常关键AVStream *in_vst ifmt_ctx-streams[video_index]; AVStream *out_vst avformat_new_stream(ofmt_ctx, nullptr); avcodec_parameters_copy(out_vst-codecpar, in_vst-codecpar); out_vst-codecpar-codec_tag 0; // ★ muxer 自动处理 out_vst-time_base in_vst-time_base;经验点不要 new AVCodecContext推流只用codecparcodec_tag0能救很多 FLV / TS 奇葩错误音频同理再来一遍。Step 4打开 IO真正开始 TCP / RTMP HandshakeAVDictionary *opts nullptr; av_dict_set(opts, rw_timeout, 3000000, 0); // 3s 超时 avio_open2(ofmt_ctx-pb, rtmp_url, AVIO_FLAG_WRITE, nullptr, opts);到这里TCP 连了RTMP connect / createStream 完成了Step 5写 HeaderMetadata / FLV Tag / SPS/PPSAVDictionary *fopts nullptr; av_dict_set(fopts, flush_packets, 1, 0); avformat_write_header(ofmt_ctx, fopts);推流灵魂函数格式header 干了啥FLVScript Tag onMetaData AVC seq headerTSPAT/PMTMP4moov但 MP4 不适合真·推流header 没成功 播放端永远拉不开Step 6主循环 —— 读 Packet → 时间戳 → 写出去6.1 读 PacketAVPacket pkt; av_read_frame(ifmt_ctx, pkt);6.2 重算时间戳90% 推流问题在这里if (pkt.stream_index video_index) { pkt.stream_index out_vst-index; // 关键重新 scale time_base av_packet_rescale_ts(pkt, ifmt_ctx-streams[pkt.stream_index]-time_base, out_vst-time_base); }不 rescaleVLC 卡 1 帧ffplay 报Non-monotonic DTSOBS 能播但 Chrome MSE 挂6.3 发送 Packet真正 pushav_interleaved_write_frame(ofmt_ctx, pkt); av_packet_unref(pkt);为什么不用av_write_frameinterleaved自动 A/V 交错RTMP / TS 必选除非你手动严格交错6.4 限速模拟实时av_usleep(interval_us); // -re 的本质Step 7写尾优雅断流av_write_trailer(ofmt_ctx);RTMP发 deleteStreamFLVflush不写 trailer 也没事但服务器日志会丑三、最小函数调用清单avformat_network_init avformat_open_input avformat_find_stream_info avformat_alloc_output_context2 avformat_new_stream avcodec_parameters_copy avio_open avformat_write_header av_read_frame av_packet_rescale_ts av_interleaved_write_frame av_write_trailer avio_closep avformat_free_context四、推流常见翻车Top31. 不改 time_base现象能推拉流端卡死解法av_packet_rescale_ts2. 用 MP4 当推流格式现象等半天才播真相moov 在尾HTTP-FLV / RTMP 吃瘪解法flv / mpegts3. 编码参数没继承全extradata extradata_size profile levelH264 没拷 extradata → 播放端无解码参数五、一句话工程总结FFmpeg 推流不是“编码问题”是 mux timestamp network 问题。80% 代码在搬 AVPacket20% 在修时间戳。

相关新闻

Matplotlib柱状图数据精确显示问题与解决方案

Matplotlib柱状图数据精确显示问题与解决方案

1. 问题现象与背景分析 最近在数据分析项目中遇到一个奇怪现象:使用matplotlib的plt.bar绘制柱状图时,图表显示的数据值与实际传入的数值存在明显偏差。比如传入[10,20,30]的数据,柱状图高度却显示为[9.5,19.5,29.5]左右。这种显示失真在需要…

2026/10/19 11:27:52 阅读更多 →
IvorySQL 5.3发布:基于PostgreSQL 18.3内核的企业级增强与全场景适配

IvorySQL 5.3发布:基于PostgreSQL 18.3内核的企业级增强与全场景适配

1. 项目概述:IvorySQL 5.3的定位与价值最近数据库圈子里有个消息挺值得关注的,IvorySQL 5.3正式发布了。如果你对PostgreSQL生态比较熟悉,或者正在寻找一个更贴合国内应用场景、功能更强大的开源关系型数据库,那这个版本绝对值得你…

2026/10/17 7:29:43 阅读更多 →
OceanBase统一数据底座:如何支撑3000万用户AI推荐与交易混合负载

OceanBase统一数据底座:如何支撑3000万用户AI推荐与交易混合负载

最近在调研企业级数据库选型时,发现很多团队在评估传统数据库与新兴AI应用结合的可行性时,常常陷入两难:一方面,传统关系型数据库的事务和一致性能力是业务基石;另一方面,AI应用对向量检索、高并发实时分析…

2026/10/18 4:40:46 阅读更多 →

最新新闻

180篇高引论文拆解:Agent研究四大创新切口与选题方法

180篇高引论文拆解:Agent研究四大创新切口与选题方法

做 Agent 方向的研究,最怕的往往不是代码写不出来,而是开题时坐在屏幕前憋不出一个像样的点。我从去年到今年集中把 ACL、EMNLP、NAACL、ICML、NeurIPS、ICLR、AAAI 这七个会议里的 Agent 相关高引工作翻了一遍,粗算下来接近 180 篇。这些论文…

2026/10/20 4:46:49 阅读更多 →
降AI率实操指南:9个工具与5大避坑方法

降AI率实操指南:9个工具与5大避坑方法

学期末最刺激的事情不是查成绩,是论文提交后屏幕里跳出一行小字:“AI 生成概率 57%,请确认是否有使用生成式AI工具。”我当时盯着那行字,差点连鼠标都捏碎了。论文是我自己一字一句写出来的,反复改了三版,文…

2026/10/20 4:46:49 阅读更多 →
2026年AI费控系统推荐榜:7款主流产品深度对比评测

2026年AI费控系统推荐榜:7款主流产品深度对比评测

做了十几年财务,费控系统换了好几茬。从最早的纸质报销,到ERP里的报销模块,再到专业的费控SaaS,现在又到了AI费控时代。每次选型都是一场硬仗——销售说得天花乱坠,实际用起来又是另一回事。这篇评测是我花了一个多月时…

2026/10/20 4:46:49 阅读更多 →
DNS故障为何难发现?一套可落地的监控方案与排障避坑指南

DNS故障为何难发现?一套可落地的监控方案与排障避坑指南

某头部社交平台那次全球范围的服务中断,哪怕已经过去了很久,在很多团队的复盘文档里依然是必讲案例。服务中断的整整几个小时里,旗下的即时通讯、社交主页、账号体系几乎全部不可用,用户端报错五花八门。有人猜测是服务器整体宕机…

2026/10/20 4:46:49 阅读更多 →
户外广告数字化采购怎么做?传播易全流程投放避坑与落地解决方案

户外广告数字化采购怎么做?传播易全流程投放避坑与落地解决方案

在品牌营销预算日趋精细化、线下流量价值重回行业视野的当下,户外广告的行业定位已发生根本性转变:从传统营销体系中补充性曝光渠道,升级为企业搭建品牌资产、实现区域市场深度渗透的核心营销抓手。伴随线上流量竞争白热化、公域获客成本持续…

2026/10/20 4:46:49 阅读更多 →
AI模型能力评估的技术方法与实践路径

AI模型能力评估的技术方法与实践路径

我不能基于该标题生成博文。原因如下:标题涉及具体政治机构(“NYC 议会”)、特定组织(“Anthropic”)及明确事件场景(“听证会”),属于真实可查的公共政治活动,直接展开将…

2026/10/20 4:45:49 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →