FFmpeg源码调试
前言最近在学习下FFmpeg源代码,也会同时记录这一学习过程。这篇是这一系列的开篇,记录FFmpeg的源码调试方法。调试环境:Mac + Xcode
整体调试流程使用Xcode调试FFmpeg源代码,主要有以下几个步骤:
下载FFmpeg源码
编译FFmpeg
Xcode调试FFmpeg源码
下载FFmpeg源码直接github上下载即可,https://github.com/FFmpeg/FFmpeg
编译FFmpeg最终的目的是使用ffplay播放视频,并且能够源码调试这个播放流程。
安装SDL库ffplay的编译依赖SDL库,所以先要安装SDL。直接是用brew安装
1brew install sdl2
开始编译FFmpeg需要编译可调试的ffplay,所以编译选项需要带上 enable-ffplay 和 enable-debug。最终的编译指令如下:
12345// 第一步./configure --enable-debug --disable-optimizations --disable-asm --enable-ffplay// 第二步 (-j8 表示并行编译使用的线 ...
重新更新
今天(2023-09-27)重新开始更新,先从换个主题开始 butterfly
iOS上使用Cocos2d-x和OpenGL ES绘制凹多边形
前言先看看在iPhone上使用Cocos2d-x与OpenGL ES绘制出来的最终效果。
图中绘制的都是圆环,或者光滑曲线构成的图形。不过本质还是绘制多边形,只要这些多边形的顶点足够多,那么就可以形成光滑的曲线。
在绘制过程中使用到的相关知识点:
Cocos2d-x渲染机制
OpenGL ES绘图基础
Objectice-C与C++混编
OpenGL Tessellation将多边形切分成多个三角形
问题的发现在使用Cococs2d-x绘制填充颜色的多边形的时候,最先想到的就是使用DrawNode 。DrawNode提供以下接口:
12// 绘制填充颜色的多边形,参数包括:多边形顶点坐标,定点数,以及需要填充的颜色void drawSolidPoly(const Vec2 *poli, unsigned int numberOfPoints, const Color4F &color);
使用该接口绘制一个四分之一圆环的时候,想达到的效果如下👇
但是实际的效果却是这样的👇
查看源码查看Cocos2d-x的DrawNode的源码:CCDrawNode.cpp
...
ARKit下的魔方
前言如题,先看看效果👇
代码在我的Github,运行起来,在手势检测上还有些不够精准。有兴趣的可以一起讨论
参考
Awesome ARKit
一次秋招
如题,记录一下辛苦的秋招
秋招结束有一段时间了。感谢今年良好的整体环境,我也拿了大大小小几个offer,最后选择了腾讯的iOS开发岗位。
从七月中旬开始正式准备算起,到10月初确定下来,一共有2个半月时间吧。
7月中旬看书,刷题
7月底内推开始,一来就是阿里和腾讯,直接一波两连跪,心情跌倒谷底=。=
开始找不足,发现iOS方面知识还算应付的过来;缺的是计算机基础知识,赶紧补一补本科的数据结构,计算机网络和操作系统
8月夹杂着各种内推面试,总算熟悉了各家的面试套路。问来问去都差不多那些东西
9.3号,今日头条内推视频面试,一下午面了三面。跟杰哥去吃饭的时候接到了hr的电话,说已经通过了。假装平静的跟hr小姐姐聊完之后,就开始激动的和杰哥噼里啪啦的讲起来了。信心大增。
之后就只面了些大厂,问的问题都大同小异。说说其中腾讯的面试吧,腾讯二面,就持续了20分钟,全程就像聊天。气氛轻松的让我以为我已经挂了。。。
9月底陆续收到了几份offer,十一之后收到了腾讯的offer。
另外,回顾这两个多月的秋招,大部分公司面试体验都是很好的。其中今日头条给我的感觉是最好的:三 ...
CALayer的时间坐标系
前言上周末,又进行了一次实验室内部的iOS分享会。这次是小学弟给我们讲的CAMediaTiming以及Runloop的一些内容。讲的很细,也很深=。=
其中提到了一点:CALayer的时间坐标系,也就是本文要讲的主要内容
时间坐标系时间坐标系这个名字听着有点奇怪,类似layer的空间坐标系。它的意思是:每个CALyer都有自己的时间刻度;在同一个全局时间下,每个CALyer自己的时间是可以不一样的。而CAAnimation参照的时间则是他所属的CALyer的时间系。
CAMediaTimingCAMediaTiming是一个协议,定义了beginTime,timeOffset,speed等属性。CALayer以及CAAnimation都实现了该协议。
在CALayer中设置CAMediaTiming的相关属性是用来更改CALyer的时间系,也就是改变每一时刻的CALyer的时间。而在CAAnimation中设置这些属性,则是为了修改动画的相关时间属性;这些时间属性都是对应相应的layer的时间系的。
CALayer的时间如何计算
t = (tp - b ...
OC关联对象及其内存管理
前言OC的关联对象经常被用来存储Category中的属性对应的实例变量,当然它还有其他的用途。
这篇文章将讨论关联对象是如何实现的,以及关联对象的内存管理问题。
Demo先用一段代码来引入要讲的东西:
1234567891011121314151617181920212223242526272829303132#import "HCBase.h"@interface HCBase (vanney)@property (nonatomic, assign) int cui;@property (nonatomic, strong) NSString *van;@end/* ----------------- 这里是分割线 -------------- */#import "HCBase+vanney.h"@implementation HCBase (vanney)- (void)setCui:(int)cui { objc_setAssociatedObject(self, "cui", @(cui), ...
ARC下关于autorelease的一些疑问
前言今天在看黑幕背后的Autorelease这篇博客的时候,发现了一些问题。主要问题在于:
123456// ARC 情况下@autoreleasepool { id __strong array = [NSMutableArray array]; NSLog(@"array count is %lu", _objc_rootRetainCount(array)); _objc_autoreleasePoolPrint();}
这里的array对象的retainCount到底是1还是2?
按照查找的博客,以及之前看的《Objective-C高级编程 iOS与OS X多线程和内存管理》这本书的结论:这里的retainCount应该是1,因为这个对象没有注册到autoreleasepool中。但是实际运行下来却并非如此。
Stack Overflow
AutoreleaseAutoreleasePool 自动释放池Autorelease就是延迟release的调用时间,将需要延迟release的对象加入autoreleasepool。当p ...
JSPatch源码分析
前言JSPatch是一个可以动态更新iOS APP的开源库。通过JSPatch,可以使用JS书写原生代码,动态更新APP,替换项目原生代码修复Bug。
JSPatch充分应用了Objective-C的runtime,来实现自己的功能。
这篇文章将结合Demo,来分析JSPatch的主要的实现过程。包括:
使用JS新建类
使用JS替换原有方法
使用JS添加全新方法
OC调用JS定义的方法
JS调用OC定义的方法
Demo使用官方提供的Demo。先来看看Demo的关键代码:
JPViewController12345678910111213141516@implementation JPViewController- (void)viewDidLoad { [super viewDidLoad]; UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 50)]; [btn setTitle:@& ...
关于ARC,Block以及GCD,runloop
前言最近又看了一遍 Objective-C高级编程 iOS与OS X多线程和内存管理 这本书。对一些问题有了一些新的认识。这篇文章将讲讲下面几个话题:
ARC,MRC 与 引用计数
Block的实现
GCD与runloop
ARC, MRC 与 引用计数引用计数Objective C的生成的数据会存放在栈或者堆上面。对于存放在栈上面的数据(比如局部int变量等)在不需要时,系统会自动释放内存空间;对于存放在堆上面的数据(比如对象等)会使用引用计数来决定是否释放内存空间。
创建一个对象时,会malloc一块对象所需大小的内存空间;当有一变量持有该对象时(一般是有一指针指向该内存时)该对象的引用计数加一;当持有该对象的变量不再持有它时(一般是指针被销毁,或指向其他地方)该对象的引用计数减一。当对象的引用计数为0时,free这一块内存
MRC和ARC实质上都是对这个引用计数进行操作
手动引用计数 MRC手动引用计数要确保在对象从被创建到销毁的一生中,该对象的引用计数也从1变成0。
与对象引用计数相关的函数只有3个:
alloc/new/copy/mut ...