分类目录归档:程序猿

初次尝试ios插件开发 & ReplayKit相关

昨天WonderParade把Ocean Adventure全部WFC了,然后想到录屏的时候,想起之前研究过的Quicktime录屏,在想能不能设备上录制

google之后搜到了ReplayKit,看起来非常简单的样子

最初尝试直接cycript执行,载入Framework之后虽然可以调用到开始和停止录制,但是因为cycript里的函数不是objc的方法,所以没办法搞回调

于是找了示例项目,粗略编了一个MS插件,作用仅仅就是声明一个ReplayKitObj类,代替调用开始/停止录制

毕竟也不熟练,怼了一阵搞出来一个能工作的版本,但是真正搞出来之后发现,ReplayKit录制质量特别渣……

基本上来讲,qt录制质量是100的话,airplay录制大概是85,rk就是60-70的样子…而且音频只录制了一个声道,这是最骚的

录制样品

ReplayKitObj.zip

总之,本来还在想要不要开发一个完整插件出来,但这么差的录制质量,还是算了

整理一下自己的程序猿生涯

其实也不知道为什么想写这个,就是看历史的东西突然想写一个这样的记录,来看看自己都弄过什么东西


2014

  • 开始接触代码,完成了下载脚本bdown(已大体废弃),和客户端缓存转码合并脚本bili

image

(那年暑假入了b站,在家ipod4能正常用最新的b站客户端,但是学校里拿的ipod3 5.1.1只能用一个特别老的,13年的版本,由此开始写代码)

  • 11月,原Tundra开发维护的BiliPlus停止服务并开源,拿了一份挂在了一个php空间上,但再未管理过网站

(算下来搭建bp比bdown早,因为早期的需求只是客户端解码flv极卡,后来无法忍受客户端的缓存bug开始自己写下载)

2015

  • 4月,把初期bp的代码进行了一些改进,因为有写bdown的经验对主流解析都比较了解。同时遇到了几位至今也在互换情报的重要好友,包括@张一环 等等各路大佬

image

(此时已是临近高考,我却每周末回去一直在搞这东西()

【那个暑假已经忘了写过什么了,主体应该就是半自学php改bp】

(当时主力机5s已因作死移动/usr/libexec到stash而入狱。妈的这个目录以前一直是没有问题的,为什么突然就死了。也正因此才会想要去剖析出softwareVersionExternalIdentifier的用途)

2016

  • 1月,爬丝沿着当初我的乐视云api解析贴找到了我,两人相聊甚欢。当时我也是认识pass的,毕竟是不二压大佬了,letv2pass我也用过传了几个视频
  • 3月,进行了一场利用收藏夹的视频全扫(现已不可行),并把数据放置服务器作aid搜索库
  • 同月,和pass第一次面基,俩人都在沈阳,相性也不错
  • 4月,源自一次偶然的github闲逛,发现了一个b站的隐藏的,分发用api(已在兽娘之后死亡),同样开了一批采集并添加了cid信息库
  • 10月,京吹时因为独特的港台直看功能,加上某个zz在3k眼前跳,然后yk就来恶心人了一阵。

(这个事其实早期也是自己想趁此火一批,当时把默认播放器改成了带跨区功能的。因为这个之后就换成了限制了)

  • 11月,借着flv.js,开始写扩展以进行更方便的“播放”,同时结识了xqq

2017

  • 2月,改动flvjs,添加了实时码率,同月改动主站abplayer,完成了一个直播html5猴子。【半个月后官方html5上线测试】
  • 3月,改动CCL添加canvas绘制,触坑无数
  • 同月月底,本是想装逼一番,搞了b的兽娘12(每集大约下午5点上传,晚上25:30网络放送),结果因壁吧群里不知名的二五仔把忘记撤回的两张图片传遍全网。所幸仅仅只有两张不能说明什么的图片,同时传开时距离tv放送只剩20多分钟,没有造成太大影响。不过因此相当一批相关的接口就死了(细究还是对不住b站的伙计,要是那天我是下午六点去搞的话,估计就不会这么清淡了)
  • 4月,鉴于本季某苣的火热,@ipcjs 的猴子同样一举成名,于是顺手给api添加了跨域权限,并帮着改动了很多地方(直接把同步blocking大改成全异步了)
  • 5月,将臆想多时的分段mp4支持完成了并加到了flv.js中。同月,本着好不容易写出一个功能,不能荒废的原则,完成了优酷html5扩展。【一个月后官方html5上线测试】
  • 8月,与@power 合作(他提供服务器与存储账号)开始进行番剧视频转存项目,自己写出php下的多线程下载模块用于减小限速影响。项目断断续续持续到11月初才完成,期间共计存了25T的视频
  • 9月月底到10月,在B站更新app新版动态后不久,开始着手写了一个web版动态,这一次所有api转发使用全部用了lua模块,虽然说基本也就是大范围复制(自己造了ngx-lua下http请求的轮子)。【官方web版与11月中旬上线】
  • 11月,将原本计划于7月份开发却坑了的acfun播放器写完了,使用反响还算不错
  • 同月月底,将转存项目链接入口加入了biliplus,并整合加入了新番剧自动任务以及用户队列添加。不同于静态数据执行时的服务器多开,这次换用了pcntl多进程进行同时5任务

To be continued…

给flv.js添加解封装器(demuxer)

估计也没人再写了

  1. 需要一个probe函数验证文件格式有效
  2. 在transmuxing-controller里添加判断,创建demuxer
  3. 需要一个parseChunks函数负责demux由io-ctl传来的文件流,参数0为未使用的arrayBuffer,参数1为相对文件头的字节偏移量
  4. 自行识别mediaInfo,在完成后调用onMediaInfo传回媒体信息
  5. 音视频流分别回调onTrackMetadata将轨道信息传给remuxer
  6. parseChunks中将音视频采样分别放置于独立track中,并调用onDataAvailable通知remuxer进行封装

终于整完了mp4 demuxer

想了挺久分段mp4的播放有什么解决方案,看着flvjs眼馋,然后一直想坑,但是又懒于开工

于是趁着这个五一,刚好前两周学校里的好几科期中也考完了,开坑!

QQ截图20170501003619

说是五一开坑,其实二十多号复制了个segment-mp4-player的时候就已经开始去翻着找mp4格式说明了。

以前听过song神说过mp4的box地狱,但是并不特别懂。正式看资料以后才算是真正理解。

具体细节就不说了,真的好奇就看文档

读取moov的时候,为了省事,我直接上了一个递归函数,一劳永逸,然后只要把boxName给switch一下具体parse就可以了。

其实mp4的格式真正读起来不会特别复杂,理清层级关系,明白自己在做什么,要获取什么,也就能顺路完成。

相比起读数据,我倒是觉得读完后整理数据才是真正的大头,比如把关键帧梳理出一个timestamp->fileposition的表才是最考验逻辑的。写的时候整个人脑子处于一种混乱的状态,最后是在顶不住选择了稳妥的列逻辑,一步步理出数据

QQ截图20170501003659

至于主要数据流的mdat部分,这部分完全就是一整片数据堆砌。同样,这里是另一个需要强逻辑的地方,每次读sample都需要先在已有的moov数据里面找到对应offset是谁的采样、采样时间戳是多少、采样有多大。我在这里直接选择了提前生成一个chunkMap,读取起来那叫一个爽快

QQ图片20170501003806

一路写代码的途中也是经常和xqq大佬交流(骚扰),也学到了很多

大概也就是这么些,说到底写出来还是个自用的东西,这年头自己做视频播放谁还专门整分段mp4

QQ图片20170501004141

gayhub

关于b站新弹幕格式.pb

格式为google protocol buffer (protobuf)

地址格式为{cid}-{part}.pb,每part包含3分钟的弹幕内容,即边播放边加载模式,如-3.pb包含第6-9分弹幕

在bilibiliPlayer.min.js中有大部分field id的定义,但文件中出现了id12-14

其中varint32为变长度int32格式,具体为每字节只有后7位存储数据,第1位为指示位,为1时继续读取下一字节

文件读取代码样本

 

腾讯视频c___key

写了两天

看到了某被无辜挂上去的源码后就动了心思,这两天到处翻文档,lua的,php的

起初只是使用string直接充当byteArray,但是后面发现局限性后引入了byteArray和byteArrayPtr类,于是之前的各种问题都解决了

听说腾讯这套变种tea enc从99年就开始在使用了

总之可喜可贺,可喜可贺

ckey


结果过了两天准备实际用的时候发现用不了……

闹心

继续一些关于ios编译的

在找到某个被挂出来的lua源之前,我准备自己整个lua调用一下bili.utility翻翻key的

win上打不开编译版本lua,搜后说是高低位不同导致

于是又打开了黑mac搞一搞编译

本来lua编译非常简单,把一堆c一起扔给编译器就可以出binary,然后codesign一下就可以跑了

此处强烈鄙视一下BigBoss那个lua(com.deltaman.lua),不codesign就往上扔真是好意思啊

问题在于第三方的c库,比如LuaSocket

首先需要启用动态载入,编译器定义常量LUA_USE_MACOSX或LUA_USE_LINUX好像都可以,此时lua需要-lreadline -lncurses

其次,编译第三方c库时必须不使用static链接

lua会报错“multiple Lua VMs detected”

所以需要先把lua下所有基础c一起,指定-dynamiclib输出liblua.dylib,然后

xcrun -sdk iphoneos clang -arch armv7 -L. -llua lua.c -o lua

然后编译第三方库的时候同理编译就可以出.so

image

后记:原本有所期待这个key会不会有点特权什么的,比如不限速,然而依旧是rate=400(默哀客户端用户)

我继续老实用player=1吧

【设想】由ffmpeg打造的点歌姬

群里的几个人在聊的这个的可行性

然后目前几方在整理可能的问题和解决方案

1、视频流上如何动态改变文字

ffmpeg的drawtext可以选择读取textfile,并且设置为reload:1时会持续重载

2、如何连续播放音频流

(未解决)目前设想测试hls兼容性,未尝试ffmpeg是否能够自动重读live型的hls

3、网络问题会导致推流失败从而ffmpeg会退出,如何连续

计划通过中间层解决,即:第一个ffmpeg实例负责读取下载到本地的音频、读取图片及文字,生成完成的流;由此ffmpeg推送到本地一个服务器,可以是ffserver或nginx;运行第二个ffmpeg负责将server的流copy至rtmp。如果rtmp发送失败只会导致第二个ffmpeg退出,重运行时不会影响到压制用实例,故可形成较为连续的流

历物语 – AWS Signature Version 4

终于把伤1看了

转着发现我漏了几天的客户端里的特殊图,找之前几位帮忙的也都没有

然后发现原来它的key是现获取的临时密钥……

难怪之前在binary里找不到


对照着官方文档摆弄了一下午,最终终于搞成了

最坑的地方是构建标准请求的时候在Header区后有两个\n


高高兴兴的直接把1/1到今天的所有信息全部获取下来了

有点小想法搭个镜像站,图+音总共似乎也不超过70M


然后就真的去弄了

顺便初接触了一下svg绘图,画了俩箭头,感觉挺简单的

https://www.biliplus.com/koyomi/