media
文章平均质量分 70
HUI的技术笔记
这个作者很懒,什么都没留下…
展开
-
codec2play流程总结
Codec2.0(C2)是android系统为vendor提供的用于实现video/audio/filter模块的的HAL层接口API,vendor可用这个API实现他们自己的HAL层,Codec2.0是用于替换现有的OMX-IL。原创 2023-07-23 22:15:28 · 833 阅读 · 0 评论 -
FFmpeg和Audacity噪声处理
FFmpeg 现在有3个原生filter来处理噪声背景:afftdn:使用FFT对音频样本进行降噪anlmdn:使用非局部均值算法减少音频样本中的宽带噪声arnndn:使用递归神经网络减少语音中的噪音。原创 2023-02-22 13:37:47 · 4271 阅读 · 0 评论 -
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 · 578 阅读 · 0 评论 -
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 · 839 阅读 · 0 评论 -
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 · 5919 阅读 · 1 评论 -
Audio采样率相关计算
audio buffer的时长和timestamp在知道采样率的情况下是可以直接计算的,这里假设采样率是44100,那么以微妙为单位,1秒等于1000000微妙,一个采样的时间计算出来就是22微妙,那么1024个采样就是22528,通常一个AAC frame通常就是1024个采样。📣 所以在计算的时候要特别小心使用的时间单位是否满足需求。原创 2022-10-21 13:25:49 · 1492 阅读 · 0 评论 -
Gstreamer BUS处理message
Gstreamer中,BUS(总线)是一个简单的系统,负责将消息从pipeline传递到应用程序。默认情况下,每一个pipeline默认包含一个BUS,所以应用程序不需要再创建BUS。应用程序只需要在BUS上设置消息处理回调程序,当mainloop运行时,将定期检查bus是否有新消息,并在有消息可用时调用回调。原创 2022-10-13 21:22:32 · 1090 阅读 · 0 评论 -
chromium中mojom中增加接口
我们因为使用mojo video decoder,所以增加一个获取底层平台的接口,从DecoderStream中获取,就需要在mojom::VideoDecoder中增加接口。是一个跨平台IPC框架,它诞生于chromium,用来实现chromium进程内/进程间的通信。中得到frames_rendered值之后,然后通过callback调用,把这个值给传出去。的定义,可以看到这个方法是纯虚函数,需要自己实现具体的功能,函数参数变成这个。原创 2022-09-23 15:09:20 · 1161 阅读 · 0 评论 -
Gstreamer利用category调试
之前总结过category的定义和使用,基于这个基础,发现利用gstreamer的categories和log系统,调试起来效率会提升很多。这两个例子都是Gstreamer中基础的部分,其他的element的category通过这个方法查找,再也不怕写错了。举个例子,如下,使用playbin播放http mp4的时候,我想知道都创建了那些element,通过指定。就可以打印出来所有的categories,这个在通过log来调试的时候非常方便。可以列出所有的category,加上。过滤后,列出来的就是。...原创 2022-08-16 21:25:13 · 226 阅读 · 0 评论 -
gstreamer-基础教程8-appsrc和appsink的应用
在appsrc上,需要设置的第一个属性appsrc是caps,它指定元素将要生成的数据类型,因此 GStreamer 可以检查是否可以与下游元素链接(也就是说,下游元素是否会理解这种数据)。这个教程通过appsrc元素,将应用程序数据注入 GStreamer 管道,并且使用appsink元素将 GStreamer 数据提取回应用程序。文件有哪些,比如用gstreamer最近的版本编译的pc文件有下面这么多,那么都可以通过pkg-config命令查到。如何将外部数据注入通用 GStreamer 管道。....原创 2022-08-14 14:48:05 · 2326 阅读 · 0 评论 -
建立本地http流服务
为了方便测试,找到下面链接中介绍的方法,通过Nodejs流API,创建了一个基本的视频流服务器用来测试。原创 2022-08-12 15:28:33 · 365 阅读 · 0 评论 -
Gstreamer中g_main_loop_new的使用
这样的用大多数情况下都没有问题,比如自己创建的player,或者pipeline里面几乎都是这么用的。原创 2022-08-11 20:43:09 · 2158 阅读 · 0 评论 -
qtcreator调试webkit
qtreator是在ubuntu上支持gdb比较好的IDE,可以方便的单步调试,快速熟悉代码。ubuntu上通过qtcreator调试wpewebkit,因为是通过cog启动,wpewebkit进程和cog不是同一个进程,需要通过attach的方式才能断点到Mediaplayer的代码。......原创 2022-08-09 17:36:35 · 337 阅读 · 0 评论 -
FFmpeg编译支持x264/openH264/dash
配置PKG_CONFIG_PATH后重新configure,然后再执行sudo make install(默认路径。建一个out目录,编译生成的临时文件都会放在out目录下,不会存在于代码目录,看着干净很多。这个configure项解决依赖问题,有些库可以直接安装dev库,有些需要自己编译。apt search xxx可以查找一些库可用apt安装的版本,找到之后,然后通过。找不到pyton2.7。.........原创 2022-08-08 20:17:20 · 2391 阅读 · 0 评论 -
重新配置chrome中ffmpeg插件
如图,FFmpegVideoDecoder的结构很简单,在Chrome的框架下,实现了Decode和onNewFrame函数,Decode是将DecodeBuffer类型的数据送给FFmpegDecodingLoop解码,FFmpegDecodingLoop中会创建AVPacket,获取解码后的AVFrame并且完成AVFrame到chrome的VideoFrame的数据转移,最后通过frame_ready_cb(onnewFrame)回调,将解码的数据送给render。......原创 2022-08-04 21:56:11 · 2084 阅读 · 0 评论 -
本地MSE播放fragment mp4服务
为了测试浏览器MSE的多媒体框架,搭建一个MSE服务会方便不少,这里记录下fragmentmp4服务的搭建过程。原创 2022-08-02 11:58:39 · 1076 阅读 · 0 评论 -
ffmpeg编译后找不到libx264
ffmpeg编译libx264完成之后,查看config.h,编译都对,但是怎么也找不到libx264原创 2022-08-01 12:23:33 · 1259 阅读 · 0 评论 -
gstreamer的caps event和new_segment event
在gst_pad_set_caps中,创建了GST_EVENT_CAPS类型的event,然后gst_pad_push_event将这个event发送到pad上,如果pad没有link,event会被存起来,处于pending状态,从后面的log中可以看到这个信息。流的时间戳和内容进行调整的信息。.........原创 2022-07-30 18:55:20 · 762 阅读 · 0 评论 -
codec2 BlockPool:unreadable libraries
使用CreateCodec2BlockPool创建codec2的block pool会报:unreadable libraries原创 2022-07-30 16:58:13 · 396 阅读 · 0 评论 -
gstreamer插件scan过程
上面这段代码是在gst_registry_scan_plugin_file中调用的,存在下面的调用栈(从下往上),init_post中调用gst_update_registry更新registry,ensure_current_registry中获取。然后,在scan_and_update_registry先通过init_scan_context初始化registry,最后调用gst_registry_scan_path_internal扫描。目录下,经过这样的方式,减小搜索的范围。原创 2022-07-08 13:42:51 · 1684 阅读 · 0 评论 -
openh264解码数据流向分析
openh264dec中finish_frame的逻辑和avviddec比起来比较简单,在handle_frame中,buffer先送给解码器解码(),然后调用将解码后的buffer发到downstream。DecodeFrameNoDelay解码,返回yuvdata,完成后unmap input_buffer:gst_video_frame_map的功能使用@info和@buffer来填入@frame的值。@frame通常被分配在堆栈中,你将把地址传给分配在堆栈中的#GstVideoFrame结构。原创 2022-07-04 19:40:07 · 984 阅读 · 0 评论 -
Gstreamer中的task
在gstreamer中,可以在需要的时候方便的创建一个task作为独立线程,task可以是普通的task,也可以是pad task,这个需要根据具体需求来定,下面先看下v4l2和avdemux里面task的代码。通过gst_pad_start_task开始一个,task函数是gst_v4l2_video_dec_loop。...原创 2022-07-03 20:40:40 · 500 阅读 · 0 评论 -
gst-launch的-v参数
先看一个简单的例子:gst-launch的pipeline,增加-v参数就可以输出caps的详细信息,包括我们想要的codec_data,那么,这个-v参数是怎么输出这些的,就需要深入跟踪下代码,因为这个输出不受GST_DEBUG的控制,是直接输出到terminal的。在gst-launch的代码中,-v参数的作用是输出状态信息和属性通知,deep_notify处理.........原创 2022-07-03 12:37:41 · 658 阅读 · 0 评论 -
C代码生成YUV420 planar格式文件
YUV420根据存储形式,分为YUV420sp(`semi-Planar 半平面`)与YUV420p(`planar 平面`),它们的数据格式在UV排列上是不同的。420p它是先把U或者V存放完后,再存放V或者U,也就是说UV它们是连续的,而420sp是UV交替存放的。I420(YU12)和YV12属于YUV420p格式,将Y、U、V分量分别打包,依次存储。NV12与NV21类似,U和V交错排列,属于YUV420sp。.....................原创 2022-07-02 22:40:37 · 645 阅读 · 0 评论 -
gstreamer ffmpeg avdec解码数据流向分析
avdec_xxx是gst-libav中的解码插件,对应文件是gstavviddec.c。avdec初始化的时候,decoder中初始化了下面这些函数,所以libav的avviddec插件中,主要的数据处理,关注几个函数的实现就可以了原创 2022-07-02 17:51:53 · 866 阅读 · 0 评论 -
MediaCodec的数据类型和使用方式
使用Input Surface时,没有可访问的输入buffer,因为buffer会自动从输入到Surface传递到编解码器。调用dequeueInputBuffer将引发`IllegalStateException`,getInputBuffers()返回一个不能写入的伪ByteBuffer[]数组。原创 2022-06-19 17:46:28 · 850 阅读 · 2 评论 -
gstreamer中解析生成android的csd-0和csd-1
在Android中,使用codec的时候,通常要先配置csd数据,全称codec specific data,通常从datasource里面都能获得,对应csd-0:SPS数据,csd-1:PPS数据,并且Android硬解码只接受AnnexB格式的数据。所以,在gstreamer中使用Android codec的时候,要配置csd-0和csd-1给codec,就先要从caps里面拿到codec_data,然后进行解析,如果不是annexb格式的数据,就要做一个buffer转换。...原创 2022-06-17 21:23:03 · 1436 阅读 · 0 评论 -
gstreamer之category
gstreamer的category,简单来说就是用于区分log信息的类别。原创 2022-05-23 22:08:25 · 388 阅读 · 0 评论 -
gstreamer的状态转换
gstreamer element和pad都可以处于不同的状态。 pad的状态与element的状态相关联,因此状态的设计主要集中在element状态。一个element可以处于 4 种状态。 NULL、READY、PAUSED 和 PLAYING。 当一个元素最初被实例化时,它处于NULL状态。原创 2022-05-20 19:29:31 · 1269 阅读 · 0 评论 -
codec2的使用
创建block pool使用CreateCodec2BlockPool创建codec2的block pool会报错,这段代码在CCodecBufferChannel中可以找到:std::shared_ptr<C2AllocatorStore> store = GetCodec2PlatformAllocatorStore();int poolMask = GetCodec2PoolMask();C2PlatformAllocatorStore::id_t preferredLinearI原创 2022-05-16 14:53:27 · 853 阅读 · 0 评论 -
gstreamer在线视频AAC声音异常分析
背景:在播放在线视频的时候声音播放不正常,通过生成pipeline dot文件分析,看到audio部分是aac raw格式,所以初步思路是dump es流后,分析gstreamer pipeline播放,然后发现问题。(dump数据后,pipeline都是在ubuntu上运行的)原创 2022-05-13 11:01:06 · 544 阅读 · 0 评论 -
gstreamer之G_DEFINE_TYPE
G_DEFINE_TYPE是一个用于类型实现的宏,它声明了一个类的初始化函数,一个实例的初始化函数(关于这些的信息请参考gtype.h)和一个名为`type_name##_parent_class`的静态变量,指向父类。此外,它还定义了一个`type_name##_get_type()`函数。原创 2022-05-11 18:55:26 · 794 阅读 · 0 评论 -
ffmpeg probe一个文件的过程
ffmpeg在看media文件信息的时候特别方便,通过-i参数指定input文件,就可以得到下面这样的输出,当然通过ffprobe也是一样的,只是ffmpeg用的太习惯了而已。原创 2022-05-06 21:54:21 · 1364 阅读 · 0 评论 -
从codec2play熟悉codec2
首先,Codec2Client::CreateFromService中通过hidl ServiceManager获取ServiceManager对象,然后通过listManifestByInterface接口,查询平台的component installce name,然后返回name合集,根据name创建创建Codec2Client对象client,SetPreferredCodec2ComponentStore将client设置到gPreferredComponentStore,后面创建componen原创 2022-05-05 16:17:43 · 2170 阅读 · 0 评论 -
去掉v4l2mpeg4dec插件的mpeg4解码能力
背景:去掉v4l2videodec的MPEG4的capsMPEG4 caps的初始化调用栈plugin_init在gst-plugins-good/sys/v4l2/gstv4l2.c文件中,是v4l2相关plugin的init函数,通过gst-inspect可以看到video4linux2对应一系列插件video4linux2: v4l2src: Video (video4linux2) Sourcevideo4linux2: v4l2sink: Video (video4linux2) .原创 2022-04-28 14:16:29 · 591 阅读 · 0 评论 -
gstreamer在线视频AAC音频声音异常分析
背景:在播放在线视频的时候声音播放不正常,通过生成pipeline dot文件分析,看到audio部分是aac raw格式,所以初步思路是dump es流后,分析gstreamer pipeline播放,然后发现问题。(dump数据后,pipeline都是在ubuntu上运行的)首先需要dump数据,dump GstBuffer到文件:GstMapInfo map;std::ofstream outfile;gst_buffer_map (buffer.get(), &map, GST_MA原创 2022-04-28 11:56:09 · 756 阅读 · 0 评论 -
vscode调试gstreamer
vscode的debug和前面的qtcreator实际上是一样的,vscode需要安装Native Debug工具,配置json文件,配置好之后vscode用起来一样方便。原创 2022-01-29 11:21:29 · 1224 阅读 · 0 评论 -
Lambda 表达式
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。原创 2022-04-25 11:03:46 · 292 阅读 · 0 评论 -
Codec2Client::createComponent过程分析
Codec2Client类继承于Codec2ConfigurableClient父类,它可以创建component,创建与component相关联的interface,是Codec2 HIDL的client实现。原创 2022-04-24 17:47:28 · 3266 阅读 · 2 评论 -
codec2中的函数命名后缀vb & nb & sm
在codec2代码中看到函数名后面带着后缀vb,nb,sm等,想知道这个缩写的意思,就从代码里面找了下,这些缩写的解释都在代码的注释里面可以找到,vb,nb从字面意思看很好理解,sm不是很直观,但是结合vb,nb,sm应该就是momentarily blockingvirtual c2_status_t query_vb( const std::vector<C2Param*> &stackParams, const std::vector<C2Param::In原创 2022-03-18 13:37:12 · 1345 阅读 · 0 评论