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

风静酱_7800

风静酱_7800

2026-10-21

843人浏览

原创

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,否则就不是封装转换,而是重新编解码——画质/时间戳/关键帧位置全变。

C++14
C++14

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

下载
  • 只调用 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。

  • 检测是否为 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 会拒播或解码异常。

  • 记录第一个 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 结构,比硬写逻辑更省时间。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2024.03.14

2248

9

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

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

2024.03.14

1019

6

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

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

2024.03.14

447

5

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

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

2024.03.14

327

5

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

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

2024.03.14

406

5

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

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

2024.03.14

580

5

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

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

2024.03.21

1409

9

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

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

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习