- 博客(225)
- 资源 (6)
- 收藏
- 关注
原创 分析AAC raw data
AAC()是一种高效的音频压缩技术,广泛用于音频流媒体和存储。AAC数据可以以几种不同的封装格式存在,每种格式都有其特定的头部信息(Header),用于描述音频流的属性,如采样率、比特率和通道配置等。下面将详细解释AAC中常见的四种头部格式:LOAS, ADIF, ADTS, 和 LATM。
2024-08-15 12:11:45 917
原创 在make类构建系统配置文件中定义函数宏
原因是‘=’号前面需要有空格。虽然可以通过,但是在实际编译的时候会报错,原因是cmake并不支持function-style的macro定义:这里使用了单引号来包围整个宏定义,可以确保如果宏定义中包含空格或特殊字符,它们会被正确地视为宏定义的一部分。
2024-07-09 20:43:00 357
原创 通过.rst(ReStructuredText)文件生成文档
完成这些步骤后,Sphinx会在你的项目目录中生成一些文件和文件夹,包括conf.py(配置文件)、index.rst(主文档文件)等。根据你的需求,编辑index.rst和其他.rst文件,以包含你想要的文档内容。同时,你可能还需要编辑conf.py文件来配置你的项目,比如设置主题、扩展等。确保你已经有了一个或多个.rst文件,这些文件包含了你想要生成的文档的内容。使用Sphinx创建一个新的项目,或者如果你已经有一个项目,则直接进入该项目目录。可以通过指定不同的目标来生成不同类型的文档。
2024-07-09 20:07:59 429
原创 编译libmp3lame支持SSE指令
这个从config.h来看,configure阶段会检测到支持SSE指令,所以HAVE_XMMINTRIN_H为1,在wrapper的Makefile中通过-DHAVE_XMMINTRIN_H=0是不行的。,对应的CPUID Flags: SSE,所以参数cflags参数是。
2024-07-09 12:03:54 231
原创 ubuntu-22.04 tenda U9安装wifi驱动
另外一个https://github.com/morrownr/USB-WiFi,还有更详细的整理,有兴趣可以看看进去,下面列出来几条预览。没精力花时间去改代码了,所以继续在github上找rtl8821CU,发现下面这个8821cu-20210916已经测试过了。了,比后面买的Tenda mini wifi好用还稳定,虽然mini wifi已经支持了linux驱动下载安装。相差不大,应该没问题,所以下下来试试,下面整理下简单过程方便参考,实际上看README.md足够详细了。,github上的代码(
2024-04-13 22:19:05 898
原创 实例分析AnnexB格式h264流startcode
我们知道,h264 流格式有两种:avcC与AnnexB。就是在 NALU 前面写上几个字节,这几个字节组成一个整数(大端字节序)这个整数表示了整个 NALU 的长度。在读取的时候,先把这个整数读出来,拿到这个 NALU 的长度,然后按照长度读取整个 NALU,我们不妨把这几个字节叫做NALU Body Length。就是在一个 NALU 前面加上三个或者四个字节,这些字节的内容是0 0 0 1或者0 0 1。当我们读取一个 H264 流的时候,一旦遇到0 0 0 1或者0 0 1。
2024-02-20 22:16:08 1066 2
原创 找不到libpng16的符号
指定-L/usr/lib/x86_64-linux-gnu/ -lpng16可以解决上面的问题。找到libpng16所在目录。
2024-01-23 10:17:32 463
原创 avcodec send_packet和receive_frame
下面是解码的过程代码,对输入给解码器的pkt桢类型进行判断,关键桢打印出,解码出来的桢根据pict_type打印桢类型出I/P/B桢类型,从这里也可以看出来,没解码之前,AVPacket只能得到是否关键帧,要知道桢类型,必须在解码后。完整代码可以从上获取。
2024-01-14 20:41:04 1207
原创 在FFmpeg源码下增加自定义程序
所以参考tools/enum_options程序,在FFmpeg源码目录新增一个目录,修改Makefile相关代码,就可以编译生成类似ffmpeg/ffplay的可执行文件,放在vscode里面非常方便的展台调试。但是问题是在FFmpeg下编译的ffmpeg/ffplay都可以直接跟踪调试,自己编译的因为连接的系统的动态库,所以不能跟踪到代码里面。查找decode3的符号可以发现,这个是包含了所有FFmpeg的代码,不需要加载FFmpeg的动态库,所以FFmpeg中的源码更新后直接。
2024-01-14 15:13:13 575
原创 结构体的几个知识点
它使用了 C 语言中的指针算术和结构体偏移量来计算包含给定成员变量的结构体的指针。这是因为结构体中的每个成员都是独立的,它们的值可以分别指定。宏来计算成员变量在结构体中的偏移量,然后从成员变量的指针中减去该偏移量,得到包含该成员变量的结构体的指针。的一个方法是将其视为一个宏,它接受三个参数:指向成员变量的指针、结构体类型和成员变量的名称。
2023-12-13 22:16:46 412
原创 FFmpeg v4l2m2m的capture和output
发现FFmpeg v4l2m2m中encoder和decoder中的output和capture的细节,理解起来有点奇怪,记录如下。对应的是输入原始视频数据。编码器的主要作用是将原始视频数据压缩成指定codec格式的数据流,以便于传输和存储。对应的是输入的原始视频数据。解码器的主要作用是将编码后的视频数据解压缩成原始视频数据,以便于播放和处理。对应输出编码后的视频数据
2023-10-26 14:29:47 1515
原创 ubuntu上ffmpeg使用framebuffer显示video
📣 这两个命令组合起来,可以看到第一个命令input.mp4解码写入到/dev/fb0后,通过第二个命令录制的output.mp4文件就是第一个的input.mp4的内容。下面这个命令使用了 FFmpeg 工具来录制 Linux 系统中的帧缓冲设备 (/dev/fb0) 的视频,并将其编码为 H.264 格式的 MP4 文件。上,从而在屏幕上显示视频。这个命令通常在嵌入式系统或类似的环境中使用,用于将视频输出到屏幕上。切换到虚拟tty,直接用第一条命令,就可以看到视频和输出log混合在一起在屏幕上显示了。
2023-09-07 09:18:43 1851
原创 FFplay播放avsync学习
ffmpeg以音频为主的同步,就是先获取当前音频帧render的时长,然后根据当前视频帧的pts计算视频帧和音频帧渲染的diff值,然后根据diff值,计算视频帧需要显示的时间长度。或者:视频晚了,晚的范围大于一个阈值:delay = 0然后根据delay计算是否送显示,并更新,最后显示是根据frame_timer。至于丢帧要看下后面的处理,当前的时间大于播放时间加上durationif(!goto retry;还有一个丢帧逻辑在中,在前面有提到。
2023-09-01 09:43:33 945
原创 FFmpeg rtp & rtp_mpegts的区别
其中,V表示协议版本号,P表示是否有填充,X表示是否有扩展头部,CC表示CSRC计数器,M表示是否是最后一个数据包,PT表示负载类型,sequence number表示序列号,timestamp表示时间戳,SSRC表示同步源标识符,CSRC表示贡献源标识符。所以,rtp muxer直接对音视频数据封包成rtp payload进行发送,而rtp_mpegts则对音视频数据先进行mpegts封装,然后再封装为rtp payload发送。具体来说,它会构建RTP头部,将数据写入输出流,并更新一些统计信息。
2023-08-29 15:01:46 1801 2
原创 ffmpeg rtp发送video和audio并播放
set audio-video sync. type (type=audio/video/ext),AV同步支持三个参数,前面的这个分离流发送,用ext做同步效果好一些,播放经过一段时间后,av同步比较好,能明显的听出来用ext同步,audio会被拉伸。这个用了copy,应该是acc的frame可能不是adts,在指定codec为aac后重编码后的aac是adts格式,video也是一样的,这个需要看代码确定一下。这里源文件是ts,也输出了sdp信息,但是指定对应的sdp播放失败。
2023-08-25 21:55:44 1467
原创 gstreamer-pipeline用法汇总
h264parse的src pad的sink caps是video/x-h264,经过处理,输出的caps是经过parse的,stream-format可以是avc,avc3, byte-stream。sink pad的caps是video/x-h264,可接收的收据stream-format只能是byte-stream,alignment只能是au。所以h264parse和v4l2h264dec放在一起,实际上不指定caps filter是可以的,可以完成自动协商。然后用gst-launch播放。
2023-08-10 10:57:09 659
原创 FFmpeg-channel rematrix
它可以将一个多声道音频信号从一种布局转换为另一种布局,例如从 5.1 到 7.1 或从立体声到环绕声。因为ffmpeg不支持12 channel播放,所以这个播放的时候会报错,需要指定layout才行,比如12channel,实际只播放8channel,这个就先不尝试了。这个命令将一个1声道、16kHz采样率的wav文件转换为12声道音频文件,并且每个声道的内容都相同。最终,这个命令会将单声道音频文件转换为12声道音频文件,每个声道的内容都相同。如果需要使用右声道,可以将。混合具有特定增益水平的通道。
2023-08-02 20:48:49 866
原创 向上取整再分析
计算机中的整数运算是向下取整的,也就是如果能整除,没有余数,那结果正好;如果不能整除,有余数,就将余数舍弃,保留相除后的整数部分。但此时正好和我们想要的结果(向上取整)相差一,正确的结果需要加上这个一。
2023-07-31 15:01:23 122
原创 FFmpeg-swresample的更新
其中int_sample_fmt就表示internal format,顾名思义,就是用于swresample内部的sample format格式。如果是0,那么audio conversion是都可以关掉的,这段代码在configure_filtergraph()函数中,flag设置为。:指定了保存的文件格式是PCM,不是wav,所以保存出来的文件按wav来解析是不对的,即使文件名为out.wav也不行。FFmpeg命令中,默认不指定aresample的时候是swr采样,使用soxr,就需要手动指定。
2023-07-29 17:15:22 760
原创 FFmpeg-两个文件mix重采样以那个为主
FFmpeg两个文件mix重采样以那个为主?对比发现,这个和-i参数后面的次序有关,默认会选用第一个的samplerate作为输出的samplerate。
2023-07-29 16:48:48 769
原创 FFmpeg aresample_swr_opts的解析
graph load的时候解析graph文本的过程,option来自filter的option,`aresample_swr_opts`是AVFilterGraph的option,而AVFilterGraph不在filter的list中,所以graph文本中不支持`aresample_swr_opts`。
2023-07-28 12:01:23 882
原创 LC3解码开发记录
对于的10.884ms的帧,采样率为44.1kHz,相应的比特率范围是14,700bps到294,000bps,对于7.5ms帧,比特率范围是19,600 bps 到 392,000 bps。可以判断,不同channel的数据是交错在一起的(ich等于0和ich等于1的时候,pcm只是偏移pcm_sbytes为2个字节,刚好是一个采样的字节数)从fp的文件中读取nch的一帧数据,frame_bytes是一帧数据的大小。是,十进制是20,存储的是frame的size,14后面紧跟frame的数据。
2023-07-24 22:43:14 763 2
原创 codec2play流程总结
Codec2.0(C2)是android系统为vendor提供的用于实现video/audio/filter模块的的HAL层接口API,vendor可用这个API实现他们自己的HAL层,Codec2.0是用于替换现有的OMX-IL。
2023-07-23 22:15:28 821
原创 AVPixFmtDescriptor结构理解和应用
FFmpeg里面有两个英文术语,plane跟components,这两个术语是不一样的,components可以翻译为分量。`plane` 翻译成中文是**平面的**意思,数据存储分为`packed`和`planar`,像NV12是半平面,Y和UV数据分开存储,但是UV是放在一起交错在一起的,所以plane是只有两个,但是存在YUV三个分量,所以`components`是3。
2023-07-21 10:07:39 323
原创 mp3 lsf扩展
今天在处理一个mp3的文件播放问题的时候,用ffmpeg把mp3的采样率重采样为16000,发现frame samples变成了576,看了下平时没有注意这个细节,一直都是习惯了1152个采样率的MP3,原来576属于MP3的LSF扩展。
2023-07-04 11:20:31 609
原创 FFmpeg dumpgraph的用法
FFmpeg的`dumpgraph`选项用于输出过滤器图的文本表示。要使用`dumpgraph`,可以运行以下命令
2023-05-18 10:39:00 427
原创 FFmpeg swresample的经验整理
resample_init的时候,会根据不同参数创建filter bank,在resample_common_int16中,通过filterbank计算输出的采样值,这个会计算到每个字节的数据,所以整体是比较耗时的。具体的,resample函数会对信号的每一个采样点进行处理,并通过计算与该采样点相邻的数据点的加权平均值来生成新的采样点。这里说的auto resampler是指ffmpeg中,在没有指定resampler的情况下,根据输入输出,自动调用resample的情况。
2023-04-16 22:10:38 1103 1
原创 FFmpeg和Audacity噪声处理
FFmpeg 现在有3个原生filter来处理噪声背景:afftdn:使用FFT对音频样本进行降噪anlmdn:使用非局部均值算法减少音频样本中的宽带噪声arnndn:使用递归神经网络减少语音中的噪音。
2023-02-22 13:37:47 4189
原创 ubuntu编译FFmpeg代码
配置PKG_CONFIG_PATH后重新configure,然后再执行sudo make install(默认路径。建一个out目录,编译生成的临时文件都会放在out目录下,不会存在于代码目录,看着干净很多。这个configure项解决依赖问题,有些库可以直接安装dev库,有些需要自己编译。apt search xxx可以查找一些库可用apt安装的版本,找到之后,然后通过。将core文件统一生成到当前目录下,产生的文件名为core.pid。编译出来找不到ffplay,如果没有。找不到pyton2.7。
2023-02-16 10:29:21 365
原创 ffmpeg filter的理解
从整体看,filte rgraph包含filter chain,而filter chain又包含了filter,所以可以分为是三个层次去理解。filter graph是链接多个filter的有向图。没有输入的filter叫source,没有输出的filter叫sink。:是由一个或多个filter chain组成,filter chain之间使用分号。:是由一个或多个filter线性连接而成,filter之间使用逗号。连接到一个filter并从那里获取输入,有一个。
2023-02-16 10:09:47 851
原创 menuconfig与Kconfig入门学习
menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。menuconfig的使用方式通常是在编译系统之前在系统源代码根目录下执行命令从而打开一个图形化配置界面,再通过对各项的值按需配置从而达到影响系统编译结果的目的。menuconfig配置后的结果将会保存在对应模块根目录下的 .config 文件中。在编译时会加载.config文件中的配置项来决定编译结果。Kconfig严格来讲是一种编程语言,它拥有自己的语法及结构。
2023-01-04 13:35:28 4595
原创 Nuttx学习入门
NuttShell 是 NuttX 中使用的一个非常完整的 shell 系统,类似于 bash 和其他类似的选项。-l表明我们在 Linux 上使用,选择完配置之后,就会在source root目录生成.config文件,删掉这个文件,重新执行命令,就可以再生成一次。Apache NuttX 在 GitHub上,有两个主要的库,nuttx和apps,后者在技术上是可选的(但建议使用完整的功能集)同时,选择配置后会生成Make.def的符号链接,指向选择的Make.def文件,
2022-12-28 20:49:55 3475
原创 gst-openmax和openmax component的理解
FTB就是app取数据,把output空buffer送给codec, FBD就是codec把编解码后的数据填好送给app,ETB就是app把input数据送给codec, EBD就是codec把inputbuffer取走了,把input端的空buffer还给app。存放空的omx_buffer, 在GstBuffer过来之后,从in_port队列里面pop一个空的omx_buffer出来,将GstBuffer转换成omx_buffer, 通过。所以empty是input端,fill是output端。
2022-12-25 20:34:44 573
原创 gstreamer-hlsdemux插件的初始流程
在gst_soup_http_src_read_buffer部分,如果读不到buffer就会返回GST_FLOW_EOS,gst_base_src_loop中会根据GST_FLOW_EOS创建EOS event,然后push到pad上,gst_uri_downloader_sink_event中再释放downloader->priv->cond条件变量,这个条件变量会结束downloader uri的线程的等待,在gst_uri_downloader_fetch_uri_with_range中可以看到。
2022-12-25 14:30:41 833
原创 hls m3u8文件学习分析
M3U(MP3 URL)是一个以.m3u扩展名存储的音频播放列表文件,区别在于.m3u8文件使用UTF-8字符编码。M3U8是Unicode版本的M3U,用UTF-8编码。M3U8文件其实是(缩写为 HLS)协议的部分内容,用文本方式对媒体文件进行描述,由一系列标签组成。HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。M3U8主要是可以做多码率的适配,根据网络带宽,客户端会选择一个适合自己码率的文件进行播放,保证视频流的流畅。以字符’#'开头的行可能是注释或者标签,标签以#EXT。
2022-12-23 22:31:57 5804 1
原创 Android HIDL和hwservicemanager
这些自动生成的文件可用来构建客户端/服务器实现链接到的共享库。用于构建此共享库的 Android.bp 文件由 hardware/interfaces/update-makefiles.sh 脚本自动生成。每次将新软件包添加到 hardware/interfaces 或在现有软件包中添加/移除 .hal 文件时,都必须重新运行该脚本,以确保生成的共享库是最新的。进程会按名称和版本号跟踪设备上正在运行的已注册 HIDL 接口,务器可以按名称注册 HIDL 接口实现,而客户端则可以按名称和版本号请求服务实现。
2022-12-23 22:03:55 2134
原创 gcc实例-几个编译选项
从我们的平台的编译参数上,存在这么几个选项,其中mthumb对代码的size影响较大,下面做一一分析。该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。-O, -O1:这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。-O3该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。
2022-12-17 20:34:15 1054
convBmptoArray.tar.gz
2008-12-06
C中的预编译宏定义.pdf
2008-11-25
编译原理及实践.pdf
2008-10-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人