- 博客(801)
- 资源 (43)
- 收藏
- 关注
原创 ffmpeg 中 allocate_array_elem 函数的使用及代码技巧
文章摘要: 本文详细解析了FFmpeg中allocate_array_elem函数的使用与实现原理。该函数用于动态分配数组元素,通过三级指针实现内存管理,具有以下特点: 函数原型:void* allocate_array_elem(void* ptr, size_t elem_size, int* nb_elems) ptr:三级指针(传递二级指针的地址) elem_size:单个元素大小 nb_elems:当前元素数量(输入输出参数) 实现机制: 先通过av_mallocz分配元素内存 再通过av_dyn
2025-07-25 16:20:09
705
原创 用ffmpeg 进行视频的拼接
文章摘要:本文介绍了使用FFmpeg进行视频拼接的三种方法。第一种是通过concat协议直接拼接文件(如ffmpeg -i "concat:file1|file2"),原理是concat协议按顺序读取多个文件数据。第二种是通过文件列表方式(ffmpeg -f concat -i filelist.txt),使用concat解复用器逐个读取文件数据包。两种方法都会在当前文件读取结束后自动切换到下一个文件,最终输出合并后的视频文件。文中还分析了相关源码实现,包括文件打开、数据读取和流处理等关
2025-07-22 17:15:10
893
原创 mpegts.c 中 pmt_cb() 代码注释
本文分析了FFmpeg中mpegts.c文件的pmt_cb()函数工作原理。该函数解析PMT(节目映射表)数据,获取节目信息和流参数。主要流程包括:解析PMT头部信息、获取PCR_PID、处理节目描述符、创建并更新节目流信息。函数会遍历所有流信息,检查PID是否已存在,并根据需要合并PMT版本。调试示例展示了37字节的PMT数据结构,包含流类型、PID等关键字段。该函数在TS流解析中起核心作用,负责建立节目与流之间的映射关系。
2025-07-14 17:45:16
599
原创 mpegts.c中handle_packet() 函数代码注释
摘要 handle_packet()是FFmpeg中处理MPEG-TS数据包的核心函数,位于mpegts.c文件。该函数主要负责解析188字节TS包的头部信息,根据PID(包标识符)将数据分发给对应的过滤器进行后续处理。主要功能包括: 提取PID并获取对应过滤器 检查数据包起始位和连续性计数器 处理适配字段(adaptation field)和有效载荷 将数据分发给不同类型的过滤器(如SECTION或PES类型) 函数被上层接口如avformat_open_input、avformat_find_strea
2025-07-14 17:20:56
743
原创 ffmpeg 中 write_option()函数详细注释
本文详细分析了FFmpeg中write_option()函数的功能与实现。该函数是处理命令行参数解析的核心模块,负责将参数值写入目标地址(全局变量或结构体字段)。文章首先介绍了函数原型和OptionDef结构体定义,重点解析了flags字段如何决定参数类型和存储方式。通过示例说明了不同选项(如-f、-y、-c)的处理逻辑,特别解释了OPT_SPEC标志用于处理多值参数的情况。最后对write_option()的代码进行了详细注释,展示了如何根据flags进行字符串复制、数值转换、时间解析等操作,以及如何处理
2025-07-11 11:35:38
861
原创 ffmpeg 代码阅读笔记2/2
本文分析了FFmpeg 4.4的转码主流程。核心函数transcode()分为初始化(transcode_init)和循环处理(transcode_step)两部分。transcode_step通过process_input读取输入包并解码,然后通过reap_filters获取过滤后的帧进行编码输出。重点剖析了过滤器系统的实现机制:当首次解码音频/视频帧时,会动态配置AVFilterGraph,随后通过av_buffersink_get_frame_flags获取过滤后的帧,
2025-07-10 11:37:19
687
原创 linux 下argv参数表所在的内存位置在哪里?
摘要:本文通过测试代码和gdb调试分析了Linux下命令行参数的内存位置。结果显示,argv参数表及其指向的字符串都位于栈区。测试程序输出参数地址后,通过/proc/pid/maps确认这些地址属于栈空间范围(0x7ffffffdd000-0x7ffffffff000)。研究发现,加载器会在栈区创建完整命令行字符串(用0分割为token),并在栈下方建立argv指针表。这验证了命令行参数及其指针表均由栈区存储的结论。(150字)
2025-07-09 10:11:01
723
原创 ffplay 中 audio_open() 函数代码分析
本文分析了ffplay中的audio_open()函数,该函数通过SDL库打开音频硬件设备并返回音频参数。主要功能包括:根据期望的声道布局和采样率设置音频参数,若匹配失败则尝试其他配置组合;处理环境变量设置的声道数;最终填充返回的音频硬件参数结构体(包括采样格式、频率、声道布局等)。函数通过多次尝试确保能在不同硬件条件下成功打开音频设备,若所有尝试均失败则返回错误。文中还详细解释了相关数据结构及参数含义,并指出部分变量命名易引起误解的问题。
2025-07-07 14:21:33
252
原创 ffplay6 播放器关键技术点分析 2/2
FFplay6播放器关键技术分析摘要 本文分析了FFplay6播放器的三个核心功能实现: 暂停功能:通过toggle_pause函数切换播放状态,调整时钟参数。暂停时停止视频刷新和音频播放,各线程进入阻塞状态。 单步播放:step_to_next_frame函数解除暂停并设置单步标志,video_refresh处理下一帧后自动恢复暂停状态。 快进/回退:通过按键设置偏移值,根据流格式确定seek_by_bytes标志,最终调用stream_seek跳转到新位置。TS流因允许字节定位和不连续时间戳而支持字节级
2025-07-06 11:26:44
830
原创 ffplay6 播放器关键技术点分析 1/2
本文分析了ffplay6播放器的视频显示关键技术点。主要探讨了视频刷新机制,包括: refresh_loop_wait_event函数以100Hz频率(0.01秒间隔)调用video_refresh进行显示刷新。 video_refresh的核心逻辑: 通过frame_queue管理视频帧队列 计算帧显示延迟时间(compute_target_delay) 实现音视频同步(AV_SYNC_AUDIO_MASTER模式) 处理丢帧逻辑(当视频落后于音频时) 最终调用video_display进行实际渲染 关键
2025-07-05 20:45:09
1047
原创 视频播放中时钟的概念及音视频同步概念
本文探讨了视频播放中的时钟概念及音视频同步技术。文章首先介绍了三种视频播放方案:固定延时播放、基于帧duration的播放以及最精确的基于PTS时间戳的播放方案。重点分析了第三种方案中时钟同步的实现原理,即通过建立PTS与系统时间的对应关系来计算精准播放时间。最后阐述了音视频同步的基本思路,通过将视频时钟与主时钟(通常为音频时钟)进行对比和调整来实现同步。这些概念为理解ffplay等播放器的实现提供了理论基础。
2025-07-05 18:36:58
704
原创 glib-object 中G_DEFINE_TYPE 宏都作了什么?
GLib对象系统中的G_DEFINE_TYPE宏通过一个简单示例展示了其核心功能。该宏用于实现C语言中的类继承机制,自动生成类型注册相关的代码。示例中定义了一个继承自GObject的Foo类,宏展开后主要生成四个关键函数:类型获取函数(my_foo_get_type)、一次性类型注册函数(my_foo_get_type_once)、类初始化函数(my_foo_class_intern_init)和私有实例获取函数(my_foo_get_instance_private)。其中核心是my_foo_get_ty
2025-06-25 15:40:57
644
原创 std::chrono 问答系列
摘要: 本文介绍了C++标准库中的std::chrono时间处理模块。通过问答形式讲解了std::chrono::duration的基本概念,包括其作为模板类的两个参数(_Rep计数类型和_Period时间单位),以及seconds、milliseconds等常用duration类型的定义。文章对比了C++ chrono与C语言时间函数的差异,用代码示例演示了如何测量时间间隔,并讨论了模板封装带来的类型安全等优势,同时指出其相对于C语言更复杂的使用方式。适合初学者理解chrono的基本原理和使用方法。 (字
2025-06-24 13:17:35
841
原创 最简单的类模板使用示例.(c++ template)
摘要 本文演示了C++类模板的基本用法。通过定义一个简单的Box模板类,展示如何用template<typename T>声明泛型类,包含set/get方法操作T类型数据。示例中分别用Box<int>和Box<string>实例化模板,说明编译器如何根据类型参数生成具体类。文章还解释了类模板实例化过程发生在编译阶段,并推荐使用cppinsights.io工具观察实例化结果。最后详细说明了Box<int> intBox这类声明语句的含义,即调用对应类型的默认构造
2025-06-24 09:48:39
327
原创 c语言命令行参数解析函数 getopt_long() 使用
本文介绍了C语言中解析命令行参数的getopt_long()函数使用方法。通过示例代码展示了如何定义短选项(如"hi:")和长选项结构体数组(如{"help",no_argument,NULL,'h'})。函数支持三种参数类型:无参数、必需参数和可选参数。文章详细说明了函数原型、选项字符串规则、长选项数组定义、返回值含义以及相关全局变量(optarg、optind)。测试案例验证了-h/--help、-i/--input等选项的解析效果,并指出未定义的-o选项会导致错
2025-06-23 19:38:47
790
原创 c语言命令行参数解析函数 getopt() 的使用
摘要:本文介绍了C语言命令行参数解析函数getopt()的使用方法。文章包含测试代码示例,展示了如何定义无参数选项(-a)、必选参数选项(-b value)和可选参数选项(-c[value])。重点解析了optstring格式规则、函数返回值含义及全局变量optarg/optind的作用。通过实例演示了命令行参数解析过程,并指出getopt()会自动将非选项参数移动到argv数组末尾的特性。代码执行结果显示,可选参数选项必须采用"-cvalue"格式而不能用"-c value&
2025-06-23 17:46:56
553
原创 GStreamer 在运行时建立管道
摘要 GStreamer动态构建管道示例解析:文章展示了如何通过信号回调机制动态构建GStreamer媒体处理管道。当处理包含多路流(音频/视频)的容器文件时,需先运行demuxer获取流信息,再选择目标流建立连接。关键点包括: 使用uridecodebin作为动态源,通过"pad-added"信号回调连接目标音频流 信号机制(g_signal_connect)实现模块间的动态连接 完整的处理链包含格式转换(audioconvert)、重采样(audioresample)和输出(auto
2025-06-23 10:08:23
1175
原创 GStreamer 手动创建管道和为管道添加元素
0. 参考代码: 1. 使用gst_pipeline_new()创建一个空管道 2. 使用gst_element_factory_make()创建元素 3 使用gst_bin_add_many()向管道添加元素 4. 使用gst_element_link()将元素相互链接, 顺序很关键,决定谁连谁
2025-06-22 16:45:18
726
原创 模板类的类型操作
1.编译期的类型判断: std::is_same 1.1 测试代码 1.2 代码分析 2 std::is_same<int,int>::value 等于true 的工作原理 2.1 $ man std::is_same 2.2 std::is_same 类模板代码 3.std::is_same 的工作过程 4. 条件编译 4.1 编译时类型过滤例子: 4.2 分析返回值类型
2025-06-22 10:44:54
852
原创 GStreamer 简单的播放控制实例
本文介绍了使用GStreamer框架实现简单视频播放器的方法。通过命令行工具ffplay和gst-launch-1.0演示了网络视频播放效果,重点展示了用GStreamer API编写的4行核心代码实现播放器功能。代码使用playbin元素构建播放管道,通过总线获取播放状态消息,实现了基本的播放控制。文章解释了GStreamer的关键概念如管道、总线和消息机制,并对比了不同播放方式的优缺点。该示例为GStreamer编程提供了简洁的入门参考,展示了如何通过简单代码实现多媒体播放功能。
2025-06-21 12:21:17
1145
原创 模板元编程基础
摘要:本文介绍了C++模板元编程的基础概念,重点区分了编译期代码与运行期代码。主要内容包括:(1)constexpr关键字用于编译期计算;(2)模板元编程的特点和构成(元数据与元函数);(3)对比模板元编程和constexpr函数的实现方式,指出后者更简洁;(4)通过阶乘示例展示两种实现差异;(5)推荐使用在线工具查看模板展开过程。文章强调现代C++更倾向用constexpr函数进行编译期计算,而模板元编程更适合类型推导等场景。
2025-06-12 16:27:12
723
原创 c/c++ 汇编码中的.cfi 指令有什么用途?
1. 几个简写词.2. 看一个简单的测试代码:3. 生成汇编代码:4. 分析.cfi 指令5. 小结:
2025-06-12 15:04:12
1078
原创 递归与循环的互换性
2.什么是递归?2.1 破除递归的神秘性!2.2 递归函数的执行过程.3 递归函数举例.3.1 简单的循环,怎样用递归表示3.2 连加, 循环与递归算法3.2 阶乘, 循环与递归算法3.3 费波那伽, 循环与递归算法
2025-06-10 14:59:33
930
原创 std::ratio 简单使用举例
1. 先看一个简单的例子 1/2+/1/3=5/62 std::ratio 的手册页3. std::ratio_add 到底是什么呢?4. 代码注释5. 加深理解.
2025-06-09 15:04:43
1070
原创 std::allocator 系列问答
本文介绍了C++标准库中的std::allocator类模板,它是一种面向对象的内存管理工具,用于分配、释放内存以及构造和析构对象。文章通过问答形式阐述了std::allocator的作用、必要性及其优势。与直接使用new/delete相比,std::allocator遵循迪米特法则,将底层内存操作封装成类方法,使其他函数无需直接调用内存分配函数。文中还提供了一个使用std::allocator的完整示例代码,展示了如何分配内存、构造对象、使用对象、析构对象及释放内存的过程。最后通过反汇编分析了std::a
2025-06-04 15:50:48
787
原创 c++返回对象,返回引用,返回指针有什么区别?
返回对象, 优化了赋值构造,直接传递了this指针. 在函数内部有外部对象向this对象copy的过程.返回引用. 在函数内部没有copy的过程, 但在调用处,有赋值构造的过程.返回指针. 就是返回一个地址, 对象的使用由指针访问.返回对象,或返回引用都是返回一个地址, 返回对象返回的是目标地址,返回引用返回的是源地址,它们都伴随有源对象向目标对象的数据copy,只是发生的时机不同.而指针没有目标之说,它指的就是源对象的地址.
2025-06-04 11:33:09
600
原创 std::nullopt 深度解析.
1. std::nullopt 是什么?1.1 nullopt 的定义1.2 struct nullopt_t 的定义1.3 测试代码:2. nullopt 的使用,2.1 测试代码:2.2 分析: obj=std::nullopt2.3 std::nullopt 是什么?
2025-05-30 10:20:37
986
原创 c++11 tuple概念和使用
uple 的使用就是直接声明一个对象. 对象的类型由模板参数来确定,对象值由初始化列表来赋值.使用上的简单对应着实现上的复杂.这个对象,背后有一个隐含的,专有的tuple结构来支持. 似乎这个结构专为生成这一个对象而定义.由于这个结构中没有定义成员变量,无法通过名称来访问, 但你可以通过索引来访问.
2025-05-29 13:11:30
826
原创 c++结构化绑定
目的: 结构化绑定是C++17引入的特性,用于简化聚合类型的数据解构操作,操作对象:结构化绑定允许开发者通过单个声明(一行代码)将复合数据对象 (如std::tuple、数组、结构体)的成员直接解构至独立的变量.实现原理: 其本质是编译器自动生成对聚合类型成员的匿名引用或拷贝
2025-05-28 16:09:53
294
原创 c/c++类型别名定义
1. #define 是宏替换.2. c风格的typedef 通用形式 typedef type_orig alias3. c++风格的using 为类型定义别名的一般格式: using alias = type_orig4. using 的优点: 可以直接使用模板类型,5.测试代码, 顺便测试一下引用折叠.
2025-05-28 13:08:44
443
原创 int &&c =5; 代码解释
1. c 的类型是右值引用.2. c 的值类型是左值引用3. 为什么会有这样的设计?4. 总结:5. 测试代码:
2025-05-27 16:01:15
555
原创 c++数据类型和函数参数传递的基本概念
1.数据类型基本概念1.1 什么是左值,右值1.2 什么是左值引用,右值引用1.3 为什么要区分左值引用和右值引用?1.4 左值引用和右值引用在函数调用中是如何传递的?2. delctype 与 typeid 的使用2.1 decltype:2.2 decltype 返回的类型可以打印吗?3. c++怎样打印传递来的参数是左值类型还是右值类型?3.1 std::is_lvalue_reference,判别是否是左值引用3.2 实例代码
2025-05-27 11:51:24
1039
原创 c/c++怎样编写可变参数函数.
可见c++编译器,很好的解决了变参函数问题, 比c好多了.你可以通过sizeof…(args)得到编译器返给你的参数个数,是个常数.你可以通过折叠表达式描述你的代码.通过…来展开操作.
2025-05-25 16:28:25
798
原创 从elf文件动态加载的过程解释got,plt及got.plt,plt.sec
1. 概念定义2. 测试源码3. 外部函数调用对应着 .plt.sec 中的一小段代码,4. .got.plt 将来存储实际的外部函数地址, 开始存储.plt中对应地址5. plt 节对应一小段代码,即以槽号为参数,调用地址解析函数.把真实外部地址存入.got.plt表
2025-05-23 17:47:13
1100
原创 new,operator new,malloc 关系.
1. new 是什么?2. operator new 是什么?3. malloc 是什么?4. 完整测试代码:5. new operator new,malloc 关系图
2025-05-23 09:50:20
1101
原创 std::initialzer_list 与花括号{}数据列表
1.{数值列表}是什么?1.1 数组初始化 时 , 称为数组初始化列表1.2. 当用于容器时, 称为容器初始化列表1.3. 对于结构体或类,{1,2,3,4,5} 可用于初始化成员变量2. std::initializer_list 是什么?3. 实现自己的initializer_list3.1 可变参数包3.2 实现自己的initializer4.std::intializer_list 使用举例5. 小结
2025-05-22 16:23:10
1180
原创 chrono类 根据duration 类的周期类型得到对应的周期名称
熟悉 chrono 定时类的用法,熟悉模板函数的写法.熟悉运行函数及编译函数的混合用法
2025-05-21 16:25:20
647
原创 remove_const的工作原理及c++的类型推导
std::remove_const_t typedef为 std::remove_const::type而模板类中又typedef int std::remove_const::type, 所以说std::remove_const::type 等价于int, 是int的小名,由typedef 定义的.实际推导的过程是用模板类匹配类型参数, 把类型参数重新typedef一下.is_same_v(T,U)的判断更加简单, 也是根据模板类型匹配, T,U为同一类型,返回true
2025-05-21 13:54:16
1255
原创 std::chrono类的简单使用实例及分析
std::chrono类的简单使用实例及分析auto t1 = std::chrono::high_resolution_clock::now(); //t1 是time_point 对象auto delta_t = t2 - t1; //2个time_point 对象相减,肯定被重构了. 返回的是 duration 对象auto dur_obj = std::chrono::duration<double, std::milli>(delta_t); //构造以ms为单位的duration对象
2025-05-20 15:02:35
984
原创 c++虚函数与类型信息
0. 测试代码:1.无虚函数的类导出符号表2.有虚函数的类导出符号表3. vtable表中储存了什么? typeinfo表中储存了什么?4. 进一步研究type_info,5. typeinfo 的意义5.1 运行时类型信息(RTTI: runtime type info)
2025-05-19 15:08:21
704
.net 中间语言 IL 指令集
2010-10-29
gdbinit-gdb 功能扩展插件
2015-07-10
linux 64位只读文件系统 romfs64
2013-11-07
tr_research.tar.gz
2020-08-14
vim73-gdb 工具
2015-02-07
gcc 函数调用探测功能
2015-09-10
全面介绍AVFilter 的添加和使用
2025-04-22
全面介绍AVFilter 的添加和使用
2025-04-22
全面介绍AVFilter 的添加和使用
2025-04-22
全面介绍AVFilter 的添加和使用
2025-04-22
离散傅立叶变换DFT及其反变换IDFT c 源代码
2024-06-28
IDA Free8.3 For Linux
2023-10-08
将视频存储为一张张jpg 图片源码
2022-06-11
linux 命名管道创建及使用demo程序
2022-06-02
监视程序的内存使用(linux c 源代码)
2022-05-04
Qt5 信号与槽研究,线程研究
2022-03-12
OpenSSH for windows (64bits)
2020-11-09
stl-views.gdb
2016-01-23
the-23-gang-of-four-design-patterns-with-cplusplus.tar.gz
2020-03-08
buttonTable.zip
2020-07-23
LFS-BOOK-CN.html
2019-12-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人