讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ FFmpeg如何从RTSP流中无损转封装保存为FLV

风静酱_7800

风静酱_7800

发布时间:2026-10-21 11:51:18

|

843人浏览过

|

来源于php中文网

原创

FFmpeg打开RTSP流卡住主因是默认行为在弱网或IPC设备上易阻塞,需显式设rtsp_transport为tcp、stimeout为5秒、probesize和analyzeduration限制探测;转封装时须AVCC转Annex B、校正时间戳、正确映射stream_index。

c++ ffmpeg如何从rtsp流中无损转封装保存为flv

FFmpeg C++ 里用 avformat_open_input 打开 RTSP 流时,为什么老卡住或超时?

RTSP 是基于 TCP/UDP 的实时协议,FFmpeg 默认会尝试 TCP 回退、重连、OPTIONS 探测,容易在弱网或某些 IPC 设备上卡死。必须显式控制超时和传输方式。

  • 设置 rtsp_transport 为 tcp(避免 UDP 丢包导致解析失败):在 AVDictionary **options 中加 av_dict_set(options, "rtsp_transport", "tcp", 0)
  • 强制超时:加 av_dict_set(options, "stimeout", "5000000", 0)(单位微秒,即 5 秒),否则默认可能等几十秒
  • 禁用自动探测关键帧(对纯流无意义):av_dict_set(options, "probesize", "32768", 0) 和 av_dict_set(options, "analyzeduration", "2000000", 0),避免卡在 avformat_find_stream_info

转封装(remuxing)必须绕过解码+编码,直接拷贝 packet

“无损”在这里指不触发 avcodec_send_packet/avcodec_receive_frame 和任何 sws_scale 或 swr_convert,否则就不是封装转换,而是重新编解码——画质/时间戳/关键帧位置全变。

  • 只调用 av_read_frame 读原始 packet,不做 avcodec_send_packet
  • 输出 FLV 时,所有 stream 必须用 AVStream::codecpar(而非已废弃的 codec)复制参数:avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar)
  • 关键:packet 的 dts 和 pts 不能直接写入 FLV,需用 av_rescale_q 转换时间基——RTSP 流常用 1/90000,FLV 容器要求 1/1000(毫秒级)

FLV 封装对 H.264/H.265 的特殊要求:AVCC → Annex B 转换必须跳过

FLV 只接受 Annex B 格式(start code: 0x00000001)的视频数据,但大多数 RTSP 源(尤其海康、大华)发的是 AVCC(length-prefixed)格式。直接拷贝 packet 会导致 FLV 播放器解析失败,画面黑或报错 Invalid data found when processing input。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 检测是否为 AVCC:查 in_stream->codecpar->extradata[0] == 1(AVCC header),此时必须转换
  • 转换不能靠 FFmpeg 自动做(AVFMT_NOFILE 容器不支持),得手写:遍历 packet->data,把每个 NALU 长度字段替换成 0x00000001 前缀
  • 音频同理:AAC 必须带 ADTS 头,若源是 codecpar->extradata 描述的 raw AAC,则需手动拼 ADTS —— 但多数 RTSP 流音频已是 ADTS 格式,先用 av_packet_is_keyframe 和 hex dump 验证再决定是否处理

时间戳对齐和起始 DTS 处理不当,会导致 FLV 开头花屏或跳帧

RTSP 流的初始 dts 常为负值或极大(如 900000),而 FLV 规范要求第一帧 dts 从 0 开始递增。不做偏移校正,VLC/ffplay 会拒播或解码异常。

立即学习“C++免费学习笔记(深入)”;

  • 记录第一个 video packet 的 dts(按 AV_TIME_BASE_Q 时间基),后续所有 packet 的 dts/pts 减去它
  • FLV 不支持负时间戳,所以校正后若仍为负,需设为 0 并调整后续差值
  • 务必调用 av_write_frame 前检查 packet->stream_index 是否映射正确(输入/输出 stream 索引不同),否则 packet 写到错误轨道,音画不同步
实际中最容易被忽略的是 AVCC 转换的边界条件:有些设备在 IDR 帧前塞了 SPS/PPS 作为独立 NALU,但长度字段只算 payload 不含 start code,手动替换时若没跳过 extradata 已携带的 SPS/PPS,就会重复写两次,导致 FLV 解析器崩溃。动手前先用 ffprobe -v trace 看原始 packet 结构,比硬写逻辑更省时间。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2248

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1019

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

406

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1409

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1217

2024.03.22

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

100

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn