ffmpeg源码学习

ffmpeg源码学习

最近在看 ffmpeg 源码,希望多了解下底层的东西, mplayer 源码太过庞大,不利于快速的分析关键代码。 ffmpeg 恰好满足需要。

主要的分析内容包括如下两个方面: demuxer 相关,解码器选取相关
1
demuxer 相关
1.1 ffmpeg
中选择 demuxer 的过程
av_open_input_file
** ->ff_probe_input_buffer ** -->av_probe_input_format2(***)-->read_probe (), 其中 read_probe 是函数指针,不同的 demuxer 基本都会实现自己的 read_probe ,举例来说, mpegts 对应的函数名是 mpegts_probe, 根据 read_probe 的返回值来判断,选择得分(返回值)最大的 demuxer

   
其中在 av_open_input_file 函数中首先调用 url_fopen ** )来判断参数中给定的视频流是 文件格式 file )还是网络流格式( rtsp rtp 等),并调用相应的 open 函数来打开流,其中 url_alloc(**) 为格式探测函数, url_connect(**)—>uc->prot->url_open(**) 为相应的流打开函数,其中 uc->prot->url_open 为函数指针,存储选中格式的 open 函数。格式判断方法比较简单:判断文件名中是否有 ,有再判断具体是哪种流,没有的话按照文件格式来处理。 格式探测完毕并打开流之后(将 uc->is_connected 设置为 1 ,url_open 函数结束。接下来执行 url_fdopen(**), 在此过程中通过 URLContext 数据结构(不同的格式会有不同的读取包的方式)来初始化 ByteIOContext ByteIOContext AVFormatContext 的成员,其成员包括流属性,已经对流的读取、写入、定位等函数指针。经过初始化此结构程序便可以读取实际的数据包来做进一步分析了。
   
   
下面以 mpegts 为例,看具体选择 demuxer 的过程。过程通过调用 read_probe ()来确定,在 mpegts 中是调用 libavformat/mpegts.c 中的 mpegts_probe ** -->analyze(***), 具体原理是读取一定数量的包(此 处是 2048Byte ,计算下来应该是 10 个包 204*10=2040 ),判断 0x47 出现的次数( 0x47 mpegts 的同步位),根据出现次数来计算分数(具体代码分析可参考引用的其他文章)。 如果匹配的话,肯定是满分,故而选择。
1.2psi
分析
    
选择完毕 demuxer format )之后,下一步打开视频流并分析。主要分析 PSI 信息,即包含的频道及各个频道关联的具体视频或音频流的信息等。具体过程如下:
av_open_input_stream
** -->read_header(), 其中 read_header 也是函数指针,在此处我们还以 mpegts 为例,实际调用的函数为 mpegts_read_header ** ),此过程主要 是分析 ts 流中有哪些视频流、音频流等参数(主要通过分析 ts 流中的 pat sdt 表等信息得出),调用过程为

mpegts_read_header(***)-->handle_packets(**)-->handle_packet(**)

其中在 mpegts_read_header ** )中首先通过 pegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1); 挂接 sdt 以及 pat 的处理函数,即 sdt pat 是最初始的信息,在 pat 中才能得到 pmt pid 以便进一步分析。在 handle_packets 中读取一个包然后调用 handle_packet(**) 处理。处理过程中调用 write_section_data

接收 pat 等信息,当一个完整的 pat 接收完毕后,调用 tss->section_cb(tss1, tss->section_buf, tss->section_h_size); 来解析,此处 section_cb 便是通过 mpegts_open_section_filter 挂接的 pat_cb( pat 为例, sdt 分析方式一样 ) 。分析过程得到 pmt pid 并通过 mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1); pmt 的解析函数挂接上来,之后便可以读取 pmt 包并处理了。通过分析 pmt 便可以得到具体的媒体流并通过 add_pes_stream(ts, pid, pcr_pid); 函数来建立各个媒体流的信息,也得到了此 ts 中包含的媒体流的数量和 id ,在 pmt_cb 中还有一个很重要的函数是 mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc); 此函数通过 mpegts_find_stream_type(st, pes->stream_type, MISC_types); 可以定位到每个媒体流的具体解码器(主要是存储 codec_id, 其他在后面初始化),之后解码的时候便可以通过 codec_id 来选择具体的解码器了。增加流的操作中会调用 tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes); 来挂接实际的解析 pes 的函数,之后便可以接收具体的 pes 包并解析实际的媒体数据。以上内容并不保证准确,需进一步确认。

经过此过程,便得到了基本的流信息( video audio 数量及相应的 ID ),在读包后分析 ID 即可相应处理,达到解复用的目的了。分析参数得到流信息的过程描述如下:主要是两个表 PAT PMT ,其中 PAT 储的频道信息,一个频道便有一个 PMT ,而 PMT 存储的是此频道由哪些流组成(视频流 音频流 以及相应的 PID ),以及流的具体格式( h264 等),通过分析完每个 PMT 便得到了总的视频流及频道等信息。具体的关于sdt和pat、pmt的介绍可参照网上信息或查阅标准文档。

 

2 、解码器相关

2.1 解码器选择:

         通过如上分析,已经得到了解码器的 codec_id ,根据 codec_id 选择即可

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值