分类目录归档:程序猿

这几天整的一些东西

为了便捷录制,ReplayKitEverywhere简陋版搞定了

用了cycript和activator自定义命令

ReplayKitEverywhere.zip


然后是前一阵我终于解决流量下使用pac代理的问题了

搜到的只有修改preferences.plist,但没等生效,重启就重置了

后来看到这个设置不是仅在重启时加载

然后就写了开机项,插到了cydia里(懒得再写LaunchDaemon了)

于是我现在流量无缝google了,巨爽啊(

(促使我重新研究的主要原因是,l2tp疯狂被干扰,服务器443没问题,只有l2tp连不上,然后socks5虽然按理说都是明文,但就是贼稳定)

如果需要添加代理域名的情况,需要root下killall -9 CommCenter(联通每次弹的好烦啊


最后是今天搞了一整天mltd

因为搞好了流量代理,所以又想坑回这个辣鸡游戏了

结果打不开,才想起当时研究的时候就碰到过,这游戏不走代理,hosts都不认

改global-metadata.dat里的域名,进去之后突然又连不上了

然后搞一通抓包发现,title里GetVersion之后,域名竟然还原了!?

看来这个鬼地方写了服务器,要实现我的无墙土豆,只能搞密钥了

ida调试ios,整了一上午,竟然真的让我瞎翻翻到了

QQ图片20180120221640

代理request,修改game_server,一气呵成,完美无墙麻辣土豆get

(资源cdn不是google家,所以不需要搞什么操作了,速度也挺快,美滋滋)

初次尝试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

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

给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退出,重运行时不会影响到压制用实例,故可形成较为连续的流