ffmpeg
文章平均质量分 77
ffmpeg
hjjdebug
西方用26个字母表示世界,计算机用0,1两个数字表示世界,大道至简!
人类用6号元素碳来思考, 计算机用14号元素硅来演算,精妙绝伦!
展开
-
av_buffersink_get_frame() 函数分析
av_buffersink_get_frame() 函数调用栈第10层: 调用函数第9层. 只是一个简单的包装函数,加flags为0第8层. 还是一个简单的调用,添加了一个参数(从ctx中拎出来的)最少采样数第7层,核心控制单元第6层.只有一个输入参数,就是graph,从中找到需要工作的filter第5层.只有一个输入参数filter, 功能: 确定向下的调用函数 activate第4层.只有一个输入参数,filter,判定是有数据要进filter,还是有数据要出filter原创 2024-08-09 15:00:33 · 816 阅读 · 0 评论 -
avformat_open_input 打开URL的流程
0 in __libc_open64 of ../sysdeps/unix/sysv/linux/open64.c:37 1 in avpriv_open of libavutil/file_open.c:84 2 in file_open of libavformat/file.c:231 3 in ffurl_connect of libavformat/avio.c:213 4 in ffurl_open_whitelist of libavformat/avio.c:347原创 2024-08-14 13:29:09 · 622 阅读 · 0 评论 -
分析 avformat_open_input 数据读取过程
avformat_open_input 中读取数据.0 in read of libc 中的 read 函数入口.1 in file_read of libavformat/file.c:1142 in retry_transfer_wrapper of libavformat/avio.c:3703 in ffurl_read of libavformat/avio.c:4054 in read_packet_wrapper of libavformat/aviobuf.c:521原创 2024-08-13 17:39:15 · 685 阅读 · 0 评论 -
av_buffersrc_add_frame_flags() 函数分析
av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF)这个函数是比较简单的,就是把frame拷贝后(引用加1)av_frame_ref()添加到buffersrc_ctx 的FrameQueue上就完事了. ff_filter_frame()原创 2024-08-09 14:32:32 · 289 阅读 · 0 评论 -
avfilter 代码分析2(avfilter_graph_parse_ptr)
着重分析一个函数: avfilter_graph_parse_ptr()原创 2024-08-08 15:53:09 · 765 阅读 · 0 评论 -
avfilter 使用与代码分析1
1. 根据文件名称打开输入文件. 2. 根据过滤器字符串初始化过滤器3. 使用过滤器4. graph内存分配: avfilter_graph_alloc5. 由名称查找filter avfilter_get_by_name6. 在图上创建filter_context原创 2024-08-07 17:48:07 · 936 阅读 · 0 评论 -
ffmpeg 解包流程
第0层 alloc_picture 第1层 h264_frame_start 第2层 h264_field_start第3层 ff_h264_queue_decode_slice (pause)第4层 decode_nal_unit 第5层 h264_decode_frame 第6层 decode_simple_internal 第7层 decode_simple_receive_frame 第8层 decode_receive_frame_internal第9层 avcodec_send原创 2024-08-06 15:13:43 · 1379 阅读 · 0 评论 -
ffmpeg 的内存分配架构
第0层: av_malloc第1层: av_mallocz第2层: av_buffer_create第3层 av_buffer_alloc第4层: av_buffer_allocz第5层: pool_alloc_buffer第6层: av_buffer_pool_get第7层: video_get_buffer第8层: avcodec_default_get_buffer2第9层 ff_get_buffer原创 2024-08-01 18:01:50 · 1111 阅读 · 0 评论 -
ts流音视频组包关键函数分析
分析1: buffer_pool_get()分析2: MpegTSContext 对象是唯一的吗?分析3: 内存池中的数据,怎样转移到packet 中?分析4: 为什么要用内存池,内存池中申请的内存,何时释放?原创 2024-07-30 13:47:56 · 822 阅读 · 0 评论 -
av_parse_pars2() 代码内存使用分析
1. 前边n次读取的数据都存放到哪了, 它们什么时候释放内存呢?2. 当发现可以组装成一个包时,发生了什么?3. parser 申请的内存啥时候释放.原创 2024-07-30 14:06:10 · 809 阅读 · 0 评论 -
av_packet_unref()代码分析
甲: 释放包的附加数据乙: 解引用AVBuffervoid av_freep(void *arg) 即释放内存,又由函数把指针赋值为空是如何实现的, 传递指针地址即可!原创 2024-07-25 15:15:55 · 338 阅读 · 0 评论 -
ffmpeg 怎样分析ts 流中的 sdt 表
1. sdt 的概念2. ffmpeg 怎样保存sdt 表中的字符串3. 这些为字符串分配的内存何时释放原创 2024-07-24 10:40:35 · 561 阅读 · 0 评论 -
av_read_frame 代码研究
0 in mpegts_push_data of libavformat/mpegts.c:13771 in handle_packet of libavformat/mpegts.c:28462 in handle_packets of libavformat/mpegts.c:29753 in mpegts_read_packet of libavformat/mpegts.c:32194 in ff_read_packet of libavformat/utils.c:843原创 2024-07-05 11:10:49 · 794 阅读 · 0 评论 -
avformat_open_input 代码再分析
我理解了如下问题,就把它作为大纲目录了.1. 在哪里和怎样查找到协议的? 是通过文件名称(url)找到协议的.2. 在哪里和怎样查找到demuxer的?3. 在哪里和怎样读取数据的?4. 是怎样分析数据的?5. 数据指针怎样rewind?6. 实现部分怎样读取文件头?原创 2024-07-03 17:56:18 · 698 阅读 · 0 评论 -
ffmpeg 从avio_read 到 file_read
第一层: aviobuf.c中, AVIOContext对象当家, 这就是pReadCtx.第二层: avio.c中, URLContext 当家, 简记为h.第三层: file.c中, FileContext 对象当家,简记为c.原创 2024-03-13 15:52:49 · 1113 阅读 · 0 评论 -
ffmpeg 从avio_write 到 udp_write
1. main 调用avio_write2. avio_write 调用flush_buffer3. flush_buffer 调用的writeout函数4. writeout 函数调用了ffurl_write 函数, 5. ffurl_write 直接调用了retry_transfer_wrapper6. udp_write 函数参数, 有一个内存handle, 数据指针和大小, 是实际传递数据的地方.原创 2024-03-11 14:20:59 · 1052 阅读 · 0 评论 -
ff_compute_frame_duration() 代码注释
* 输入参数: s(格式上下文), st(流), pc(分析器上下文), pkt(包) * 输出参数: pnum(分子地址),pden(分母地址) * 描述: 返回 frame 时长,秒值,用分数表达. 得不到时长时返回 0(*pnum=0,*pden=0);原创 2023-10-26 15:15:08 · 124 阅读 · 0 评论 -
avformat_find_stream_info 为什么总是等到超时或超过大小才退出?
avformat_find_stream_info 为什么不能正常退出了?对于 ts 流文件,如果你设置了scan_all_pmts 选项, 则主动退出条件将不会满足,因为它的ctx_flags一直是1而不能清0. 所以find_stream_info 不会主动退出. 只能等超时或超过指定大小才退出了。原创 2023-09-21 11:11:36 · 353 阅读 · 0 评论 -
从c++的角度来看ffmpeg 的架构
1. AVClass 类就是一个普通的类. 基本的类.2. ffmpeg 中包含了很多context类, 它们共同继承于baseContext类.3. ffmpeg 中有很多对象: 这些对象都是常对象,存在于全局变量中原创 2023-08-01 11:35:20 · 745 阅读 · 0 评论 -
ffmpeg 的帮助系统
$ffprobe -h 1996行输出$ffmpeg -h 111行输出$ffplay -h 8492行输出在 /home/hjj/FFmpeg-n4.4/fftools/cmdutils.c 下调用 show_help_default() 函数, 根据执行文件的不同,它可能会连接到ffprobe.c 或 ffmpeg.c 或 ffplay.c , 而这三个执行文件中各有各的实现. 这属于不同的执行文件,没什么好说的.它们各自调用的函数,主要还是show_help_options(), show原创 2023-07-31 14:51:22 · 770 阅读 · 0 评论 -
ffmpeg 中 av_log 是怎样工作的?
av_log 功能其实只是添加了颜色,LOG级别,及log上下文名称,没有添加时间,函数名称,行号等信息.原创 2023-07-27 15:05:32 · 667 阅读 · 0 评论 -
ffmpeg av_parser_parse2函数分析各种码流测试程序
我需要一个简单的程序,实现能跟入ffmpeg 库.了解av_parser_parse2的工作原理.关于测流码流的获取,通常我们见到的是音视频在一起的ts流文件,你可以用ffmpeg 工具提取.av_parser_parse2 代码分析:其实整了半天,发现写这么多代码,只是把原数据进行了分割,每次读一个片段到packet中而已!简单的说,你如果知道包的长度,喀喀!,从大缓冲中copy到packet中指定长度就可以了.原创 2023-07-14 16:27:24 · 1733 阅读 · 0 评论 -
ffmpeg anull 是个啥?
/给了pads 指针,又给了idx,当然可以返回name, 这个指针对anull而言必然是文件中定义的地址.首先获取filter , 过程是枚举,这里忽略.拿到了AVFilter 对象的指针ff_af_anull, 在文件中定义的全局对象。anull 对象是一个全局对象,它的地址是通过avfilter_get_by_name()找到的.由于参数是filter=anull, 从=号处分割,前为"filter", 后为"anull"所以调用: show_help_filter("anull")原创 2023-07-13 18:01:54 · 1300 阅读 · 0 评论 -
ffmpeg get_bits() 函数是如何工作的.
GetBitContext 是如下定义的, 没有什么特别之处,指明了数据指针buffer,size_in_bits.是如何从Ctx 中获取所需的数据位的,下面是测试程序,调试可完全搞懂.//my_get_bits函数是get_bits.h 中get_bits函数的翻版, 把宏去掉方便看清本来面目//改名字不与头文件中的名字冲突//调试知get_bits() 原来是把左边的位去掉,把右边的位去掉,保留了所指定的 n bit位原创 2023-07-13 16:48:11 · 1379 阅读 · 0 评论 -
ffmpeg ts section 表及pes表解释
pes = add_pes_stream(ts, pid, pcr_pid) 其中会打开Pes 过滤器 mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);根据pmt_pid,可以创作一个Pmt filter, mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);其中ts 是上下文,pid是基础流id, mpegts_push_data 是回调函数,pes是回调函数的参数。原创 2023-07-10 15:55:56 · 861 阅读 · 0 评论 -
理解 ffmpeg avio 操作
一: AVIOContext 对象二: URLContext 对象三: URLProtocal 协议原创 2023-07-06 19:15:39 · 1383 阅读 · 0 评论 -
errno 5追踪.
再打开文件,看到了35到133的错误号定义,它包含了一个文件 #include -> /usr/include/asm-generic/errno-base.h。打开,我们看到了错误号125 - 133的定义, 还有一个包含文件 -> /usr/include/linux/errno.h。-5, 这种小号的错误值是ffmpeg 把系统错误号取反形成的,原创 2023-06-29 14:36:39 · 328 阅读 · 0 评论 -
ffmpeg 录制和播出复用流(多节目流)
关键就是用-map 影射不同的流,有了一个顺序,再用-program 去选择它,从而完成从多节目到多节目的映射!原创 2023-03-05 14:10:01 · 854 阅读 · 0 评论 -
ffmpeg 中av_rescale_rnd 的含义
由此我们看到,其实不是五种舍入方式,还是3种舍入方式. 所谓的趋于0舍入就是下舍入。 所谓的趋于无穷舍入就是上舍入。 搞得这么玄幻,何必呢? 可能是历史原因吧.原创 2022-11-25 14:06:48 · 2083 阅读 · 3 评论 -
av_gettime() 与 av_gettime_relative() 是什么含义?
总结:int64_t av_gettime(void) //返回大纪元开始后的微妙数int64_t av_gettime_relative(void) // 返回开机后开始的微妙数原创 2022-11-10 11:13:23 · 2187 阅读 · 1 评论 -
AAC 音频数据结构实例分析:
ADTS的头信息分为:固定头信息(adts_fixed_header,28bits)和可变头信息(adts_variable_header,28bits)两部分。number_of_raw_data_blocks_in_frames: 当前音频包里面包含的音频编码帧数,为0代表1frame.另外,frame 个数number_of_raw_block(用0表示)总是1,raw_data_in_frame总是1024。copyright_identification_bit: 直接置0,解码时忽略这个参数。原创 2022-10-27 19:11:20 · 1797 阅读 · 0 评论 -
解决 symbol lookup error av_opt_child_class_iterate, version LIBAVUTIL_56
经查,是因为我安装了gimp, 它会在 /lib/x86_64-linux-gnu 安装了libavformat, libavcodec, LIBAVUTIL 等库,干扰了ffmpeg 的运行。这个错误是说,LIBAVUTIL_56 这个库中没有av_opt_child_class_iterate 函数声明,因为我的库都在/opt/ffmpeg_build/lib 目录下,用ldd ffmpeg 观察,保证其为正确链接就可以正常运行了!算是解决问题的经验,留存!原创 2022-10-24 20:53:52 · 1712 阅读 · 3 评论 -
ffmpeg 中 -f <format> 字段的意义
正确的format会返回一个file_iformat,这是一个AVInputFormat 结构,该指针会被传递给avformat_open_input,输入文件格式file_iformat 会在avformat_open_input 时进一步判断,当发现还没有确定,会进行探测.对于输入,如果不指定-f, ffmpeg 会根据输入数据(来自于输入文件,或输入设备或其它协议)来判断数据的封装格式.以输入为例,该format 字符串, 打开文件的时候如果其不为空,会被用来查找对应的格式.原创 2022-10-23 16:11:30 · 1882 阅读 · 0 评论 -
ffprobe 的使用介绍
提取信息可以用 -show_entries 后跟参数stream, packet,format等, 也可以跟frame,由于要解包,会比较慢.输出格式可以选择: default,xml,json,flag,csv,ini 各有各的用途,为了输出多样化.由-of 指定。原创 2022-10-12 12:41:00 · 780 阅读 · 0 评论 -
avformat_open_input() 代码分析
我不想把代码抄下来一行行分析,有人已经这么做了.而是想就关键问题进行分析.甲. 输入文件格式是如何确定的? avf->iformat乙: avf->nb_streams 是如何确定的?丙 AVFormatContext 中av_class 是何时赋值的 ?原创 2022-10-05 17:53:59 · 1385 阅读 · 1 评论 -
何为AVOption?AVClass? 及其关联的若干个Context
AVOption 是一个结构,它的每一个实例,用来描述AVContext 中一个成员变量.这一句话挺抽象的,包含了不少信息.AVContext 当然也是一个结构, 是用户自定义的一个结构。 c语言也就只有结构了.我们随便定义这个结构,但是要求它的第一个成员是AVClass 指针.原创 2022-09-30 20:26:43 · 799 阅读 · 1 评论 -
ffmeg 中fftools/Makefile 分析
从这句话可以看出, $(CONFIG_LIBMFX),$(CONFIG_VDA),$(CONFIG_VIDEOTOOLBOX)为空。还定义了一些变量依赖,比较复杂的是还包含了一个.d依赖,这个.d依赖可能会是一个列表,根据OBJ-$(1)文件个数。# makefile (从“fftools/Makefile”,行 9), 变量要滞后展开,所以就保持原样了.# makefile (从“fftools/Makefile”,行 8), 说明后面再没有重新赋值了。问题:怎样快速知道变量的定义?...........原创 2022-08-15 10:23:59 · 652 阅读 · 0 评论 -
ffmpeg 像素格式基础知识
0, 1, 0, 0, 8, 0, 7, 1 }, /* Y */ 亮深是8bit, 后3项不用了,前4项plane,step,offset,shift。{ 1, 1, 0, 0, 8, 0, 7, 1 }, /* U */ 色深1是8bit。{ 2, 1, 0, 0, 8, 0, 7, 1 }, /* V */ 色深2是8bit。例如如 AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_HWACCEL。...原创 2022-08-04 14:51:58 · 2376 阅读 · 0 评论 -
ffmpeg 枚举decoders, encoders 分析
列出codec 列表,也只是枚举各codec,打印了其能力,名称,长名称而已..... // 很多,180个encoder, 480个decoder。该函数要做的只是把描述符指针组织成一个数组而已. 采用了2次扫描原则,第一遍获得了个数, 然后分配了指针内存,第二遍把各地址填充了进去。当你实现一种codec 时,可能只要实现必需的几个函数接口就可以了。分析以后发现,概念比较简单,属于数据组织而已。第二步,由id可以获得对应的codec指针。codec 列表也定义了一个大的数组。... //忽略, 很多。.原创 2022-08-03 19:22:04 · 641 阅读 · 0 评论 -
ffmpeg -sources分析
if ((ret = av_dynarray_add_nofree(&device_list->devices, //加入数组。if (snd_device_name_hint(-1, "pcm", &hints) < 0) //拿到所有卡信息的hint。2层指针是指向表格的指针,这个表格是一个指针表格(一层指针),2层指针解引用是指针。.........原创 2022-08-03 16:49:01 · 550 阅读 · 0 评论