OpenGL ES特效分析 --- 跳动的心 很早之前就见过一个博主发的shader图片,一个跳动的心, 感觉太好玩了,于是想要分析一下原理,上面的博主也已经做了初步分析,但是对于我这个特效小白来说还是太难,于是就更详细的分析了一遍。
学习笔记 -- 从零开始学习Android Camera2 -- (1) 学习一个框架,第一步学习肯定是照着代码看文档。既然要看代码,就要看最权威的,这里我是代码是参照android给的官方示例,结合官方文档来看,所以首先要先看一遍文档,然后重写一遍它里面最基础的Camera2Basic。
从头用脚分析FFmpeg源码 - av_interleaved_write_frame | av_write_frame 本文所使用的是FFmpeg n4.4的源码,所有分析均来自博主瞎猜,如果有误,欢迎批评指正。
从头用脚分析FFmpeg源码 - avcodec_send_frame | avcodec_receive_packet 编码阶段重要函数,这个函数会判断所使用的AVCodec是否已经实现了receive_packet函数,从而判断是否是调用receive_packet编码还是调用encode_simple_receive_packet编码。相对应avcodec_send_packet | avcodec_receive_frame而言,avcodec_send_frame | avcodec_receive_packet 是编码用的。多线程编码,配合调用avcodec_open2 时,打开的编码线程。
从头用脚分析FFmpeg源码 - avcodec_send_packet | avcodec_receive_frame 然后通过判断avci->buffer_frame->buf[0]是否null来决定是否调用decode_receive_frame_internal来接受解码后的frame。需要注意的是,AVCodecContext必须经过avcodec_open2函数打开,输入的AVPacket会在内部增加一个ref,所以如果要free,外部也应该调用av_packet_unref。avcodec_send_packet和avcodec_receive_frame中最核心的函数,大部分的编码格式都会调用到这里解码。
从头用脚分析FFmpeg源码 - av_read_frame 从AVInputFormat或者raw_packet_buffer中读取一个AVPacket,如果raw_packet_buffer中有,就从raw_packet_buffer中读取,没有的话,只能从对应的AVInputFormat中读取。)分析出视频一帧(或音频若干帧),返回,下次进入循环的时候,如果上次的数据没有完全取完,则st = s->cur_st;读取一个AVPacket,如果buffer里面存在,就从buffer中读,没有就调用read_frame_internal函数,从流中读。
从头用脚分析FFmpeg源码 - avformat_write_header 看源码之后感觉申请数据没发现什么,这个函数最重要的就干了两个事情,第一个是调用avformat_init_output,初始化mutex,实际上大部分都是检查格式,然后写入options。这个函数就三个作用,第一个作用是把options设置到AVFormatContext中,第二个作用就是遍历所有的AVStream,然后检测AVStream中的参数是否正确。其实就是init_muxer的一个封装,avformat_init_output在回输出多个文件的格式中会调用多次,比如m3u8格式。
从头用脚分析FFmpeg源码 - avcodec_open2 worker线程函数,就是等待ThreadContext中的信号量,如果等到了,就判断当前唤醒的是否是自己这个task_index,如果唤醒的是自己这个task,就进行编码操作,编码用的来源frame和输出pkt,都是来自于ThreadContext的tasks数组中,如果不是就继续等待下一个信号量。代码贼多,和avformat_find_stream_info有的一拼,但实际上没干很多东西,基本都是在malloc然后check,需要注意的就是多线程编码。按照惯例,看FFmpeg的解释。
从头用脚分析FFmpeg源码 - avcodec_alloc_context3 这个函数平平无奇,就是分配了一块内存给AVCodecContext,然后调用init_context_defaults初始化了这个函数。avcodec_alloc_context3主要就是生成一个AVCodecContext,然后初始化。按照惯例,先看FFmpeg怎么解释的。初始化函数也平平无奇。
从头用脚分析FFmpeg源码 --- avcodec_find_decoder | avcodec_find_encoder 实际调用的是find_codec函数,输入AVCodecID和一个判断函数,avcodec_find_encoder中输入函数指针作用是编解码器是否为编码器,avcodec_find_decoder中则是判断是否为解码器。就很简单,就是根据输入的AVCodecID类型,找到对应的解码器。根据输入的AVCodecID类型,找到对应的编码器。
MacOS编译ffmpeg 出现 ERROR: openssl not found 今天心血来潮,突然想开始研究ffmpeg的源码,所有依赖库下载完成后,在用一下命令configure的时候sh configure --prefix=/usr/local/ffmpeg \--enable-gpl \--enable-version3 \--enable-nonfree \--enable-postproc \--enable-libass \--disable-libcelt \--enable-libfdk-aac \--enable-libfreetype \--e
Android中遇到的待解决问题 问题一: HorizontalScrollView与ScrollView连用,导致ScrollView的match_parent属性异常示例布局如下 <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="200dp" app:layout_constraintTop_toTopOf="parent" app:layout_co
Android上的巨坑|使用ActivityMainBinding 并没有自动生成类 在拷贝别人代码的时候发现找不到这个类,查看了xml的写法后发现xml并不是用layer作为最顶层。那该如何使用AndroidBinding呢对比代码后发现是在build.gradle 中添加 buildFeatures { viewBinding true }添加后完美解决问题,然后查了官网,看卡这个buildFeature的介绍https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/a.
Android上的巨坑 | Failed to find configured root that contains 这个博主写的很好,亲测可行。https://blog.csdn.net/fengyuzhengfan/article/details/52876586