22号晚上在vu刷ip,想看能不能刷出ip不是45的
开几个都还是一个区的,作罢,点进最底下一个,destroy,yes一气呵成
出来就懵了,列表里cost怎么都是$0.01
当时血崩,靠删错了
我这里好像改了几个文章,也想不起来改了啥了
bp从7号到22号收集的view,banner,splash没了,番剧数据我20号拉到本地改东西,是唯一的备份
pass那里少了个公告,之前搞的表单倒是早了,没事
之后我看着研究下,搞个三天一次自动snapshot吧…稳一点
22号晚上在vu刷ip,想看能不能刷出ip不是45的
开几个都还是一个区的,作罢,点进最底下一个,destroy,yes一气呵成
出来就懵了,列表里cost怎么都是$0.01
当时血崩,靠删错了
我这里好像改了几个文章,也想不起来改了啥了
bp从7号到22号收集的view,banner,splash没了,番剧数据我20号拉到本地改东西,是唯一的备份
pass那里少了个公告,之前搞的表单倒是早了,没事
之后我看着研究下,搞个三天一次自动snapshot吧…稳一点
大家好,我是爬丝,对,那个傻逼爬丝~
在加拿大的最后一天,此时是下午,闲的没事,就想把之前想说的话都说出来,想了半天,还是在lcz大佬的博客写吧~
其实吧,我是15年知道的biliplus,之前知道的都是jj啊还有一些现在的新人都不知道的解析网站。
曾经硕鼠都用过几年(现在基本都属于半死不活的状态),所以在16年中,因为乐视黑科技的问题,lcz大佬在b吧发了乐视云的解析相关信息,我们当时已经在后乐视时期成立了新的 B站胡乱瞎搞黑名单开发小组,简称B站黑名单小组。一共算我是四位成员。
后来看到lcz大佬的帖子后,我感觉这不是个好事情,然后私信留言,加QQ聊个半天,居然发现这个人很有趣啊,技术也可以,人也很正直,于是在进行讨论后,我把lcz大佬拉入了表群,视频研究协会,然后几天后拉入了里群。
至此,5人组正式成立了。
很开心,在我没想到的时间点有这样的志同道合的瞎几把搞的同好(大雾)一起玩确实开心。
然后在聊天中得知,lcz大佬是xian人,来沈阳上学,居然是学他妈的最特么屌炸天的物理。
贼巧,我当时毕业后在沈阳上班,正好是我上了半年班的时候,于是顺理成章的面基了。
大佬坐地铁到铁西,我把他领到了我的家里,然后一起玩了一些游♂戏。
非常开心,非常愉♂悦,时常屋子里传出了开心的呻吟声……(←巨雾)
第一次面基研究了无数的技术,在lcz大佬的帮助下,我的xbr192音频压制器被完善了,神他妈没有ffmpeg哈哈哈哈哈哈哈……
于是走的越来越近后,biliplus我也逐渐的开始研究测试。
lcz大佬技术确实没问题,这方面我是很有自信的,没有lcz大佬办不到的事,如果有,请看这行第一句……
但是毕竟是学生,有些方面,我身为一个长者,给他传授些人生的经验,很惭愧,我只做了一点微小的工作,毕竟苟利国家生死以,岂因祸福避趋之……
于是顺理成章,bp的一些额外的事情我也逐渐开始给lcz大佬提建议与我的想法。
只是,没想到,bp居然到17年的今天,出现了这样的事情。
B站在经历了两次商业化的举动后,现在彻底已经成为了一家正经的商业公司,倒不是说商业化不好,毕竟是需要赚钱,这道理没有任何问题,别谈什么爱,现实就是金钱,想的太多反而给自己弄得那么累。
只是B站最近几年做的是越来越差,总体感觉就是三次元充斥这整个网站,已经无法找到曾经的那个感觉了,老用户流失度越来越高,新用户脑残度越来越高,老员工离职率一直居高不下。
这些问题说明了,B站已经变质了,已经完全不是曾经的B站了。
从视频整体质量和直播活动与一些(所谓的逸国趣事)等都能看出来很多细节。
所以,逐渐打击曾经是巴不得你创建的网站。
也就是,曾经幕后支持bp、jj此类网站,而且也是放任不管。
现在是正式开始打击,因为,【此类网站已经开始损害了B站的利益!】
什么叫损害?你让B站赚不到钱,你让B站本来赚6位数,你的网站让他损失了5位数,那就得律师函了对吧。
同类网站,某知名网站站长发微博,在前几天收到了律师函,并正式停止了网站,可怜可惜可叹。
而bp目前还没有大面积损失B站的利益,所以,也可以勉强苟活一段时间。
从lcz大佬的【关于网站的一些事情(附后文)】的文中能看到他对bp的爱,以及对这个网站的不舍,以及暗讽B站的举动。
不难看出,现在的bp已经到了一个关键点,关于这方面的事情我前一段时间跟lcz大佬彻夜长谈,相信他心里已经有B数了。
正如lcz大佬所说,bp迟早会关闭,但不是现在,起码,低成本的维护bp还是可以的。
【你们有没有想过,bp,是lcz大佬一个人从头到尾整整2年半的维护。】
期间B站更新一次,lcz大佬就得重新后台维护一次,还为了保证网站不进入维护状态,自己花了多少心血,付出了多少汗水,这些东西没人知道,你们只在乎你们自己爽不爽,从来没有关心过这些幕后的staff。
我对bp的爱全部都是因为lcz大佬,我是一心想帮助lcz大佬做好bp。
每一次lcz大佬有新功能,都会在我们内部群让我们帮忙测试。
写一个新功能需要付出多少精力和时间,做这个的人你们自己明白。也得亏lcz大佬没有产品经理管他,他自己说的算……
总之,说这么多到现在有1800字了,我还是难以接受bp的现状。
如果你用过biliplus,如果你真的觉得这个网站不错,如果你真的想让bp再苟活几天,如果,如果你不想以后再也看不到这些网站的幕后维护人,不想看到他们逐渐丧失动力,丧失理想。
仅你自己一份力,在bp困难的时候伸出援手。
B站已经没有爱了,但是,我们这群老人还是在努力的做我们自己,我们还在努力的坚持着,我们,还在,让大家开心。
谢谢那些曾经帮助过bp的人,谢谢那些曾经为了bp做出贡献的人。
谢谢你们,谢谢,我的谢谢微不足道,但是,我的心所想,我希望让你们明白。
没有你们,也就没有biliplus的今天。
【附】:
↓ lcz大佬的个人支付宝赞助二维码 ↓
lcz大佬的paypal赞助地址:【esterTion的Paypal赞助地址】
以及,曾经为了这份爱的大家:【biliplus赞助名单】
就这样,再一次,感谢你们。
(Ps.大佬啥时候回沈阳,你还欠我一顿饭呢,是吧,上次海底捞吃得多爽,这次我想吃潮汕嫩牛火锅,大佬咱是不是,嗯?~\(≧▽≦)/~)
[NyaPass7 于 (加拿大东部时间)2017年8月16日 15:42:29 有感而发]
游戏没啥兴趣,已删,不再更新
用仓鼠太太的芙蕾雅镇一下
感觉自己就很无聊(
下午做了点纯体力劳动,解了一波卡面
https://pan.baidu.com/s/1aC0YmjqgBd7tBgECDXM1kQ
就真的是纯体力,没有加密,所有素材全部unity3d格式放在raw里,批量一跑就完事了
拿着AssetsBundleExtractor跑batchexport,然后批量选中assets,导出所有的Texture2D
CardBattle和CardL都是Sprite裁剪的形式,不过每个都是固定位置,就用chrome的自动下载跑了一批canvas裁剪
估计也没人再写了
You can:
You can’t:
想了挺久分段mp4的播放有什么解决方案,看着flvjs眼馋,然后一直想坑,但是又懒于开工
于是趁着这个五一,刚好前两周学校里的好几科期中也考完了,开坑!
说是五一开坑,其实二十多号复制了个segment-mp4-player的时候就已经开始去翻着找mp4格式说明了。
以前听过song神说过mp4的box地狱,但是并不特别懂。正式看资料以后才算是真正理解。
具体细节就不说了,真的好奇就看文档啊
读取moov的时候,为了省事,我直接上了一个递归函数,一劳永逸,然后只要把boxName给switch一下具体parse就可以了。
其实mp4的格式真正读起来不会特别复杂,理清层级关系,明白自己在做什么,要获取什么,也就能顺路完成。
相比起读数据,我倒是觉得读完后整理数据才是真正的大头,比如把关键帧梳理出一个timestamp->fileposition的表才是最考验逻辑的。写的时候整个人脑子处于一种混乱的状态,最后是在顶不住选择了稳妥的列逻辑,一步步理出数据
至于主要数据流的mdat部分,这部分完全就是一整片数据堆砌。同样,这里是另一个需要强逻辑的地方,每次读sample都需要先在已有的moov数据里面找到对应offset是谁的采样、采样时间戳是多少、采样有多大。我在这里直接选择了提前生成一个chunkMap,读取起来那叫一个爽快
一路写代码的途中也是经常和xqq大佬交流(骚扰),也学到了很多
大概也就是这么些,说到底写出来还是个自用的东西,这年头自己做视频播放谁还专门整分段mp4
Day 1 (Mar.4th)
这次改canvas绘制是直接在ccl的基础上添加,出来的成品是准备双模式兼容的
并且,按照一贯canvas绘制习惯,带高dpi优化
Day 2 (Mar.5th)
Day 3 (Mar.6th)
格式为google protocol buffer (protobuf)
地址格式为{cid}-{part}.pb,每part包含3分钟的弹幕内容,即边播放边加载模式,如-3.pb包含第6-9分弹幕
在bilibiliPlayer.min.js中有大部分field id的定义,但文件中出现了id12-14
pb格式弹幕 Field常量 1 row (Row) 2 chat_server (string) 3 chat_id (varint32) 4 mission (varint32) 5 max_limit (varint32) 6 source (string) 7 ds (varint32) 8 de (varint32) 9 max_count (varint32) 10 realname (varint32) 11 sectionlen (varint32)(一般为180) //猜测id 12 duration (float) 13 total_count (varint32) 14 pb_version (varint32)(目前常量1) pb格式弹幕row Field常量 1 playtime (float) 2 mode (varint32) 3 fontsize (varint32) 4 color (varint32) 5 times (varint32) 6 poolid (varint32) 7 hash (string) 8 dmid (varint32) 9 msg (string) 10 uid (varint32)(暂未出现) 11 uname (string)(暂未出现)
其中varint32为变长度int32格式,具体为每字节只有后7位存储数据,第1位为指示位,为1时继续读取下一字节
function readVarInt32($fp){ $b=0; $result=0; do{ $b=unpack('C',fread($fp,1))[1]; $result = $b & 0x7f; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<7; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<14; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<21; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<28; if(!( $b & 0x80 )) break; for($i=0;$i<5;$i++){ $b=unpack('C',fread($fp,1))[1]; if(!( $b & 0x80 )) break; } }while(false); return $result; }
文件读取代码样本
<?php /* BiliBili pb danmaku reader @author esterTion(esterTionCN@gmail.com) */ $pb=fopen('http://comment.bilibili.com/14328539-1.pb','r'); function readVarInt32($fp){ $b=0; $result=0; do{ $b=unpack('C',fread($fp,1))[1]; $result = $b & 0x7f; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<7; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<14; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<21; if(!( $b & 0x80 )) break; $b=unpack('C',fread($fp,1))[1]; $result |= ($b & 0x7f)<<28; if(!( $b & 0x80 )) break; for($i=0;$i<5;$i++){ $b=unpack('C',fread($fp,1))[1]; if(!( $b & 0x80 )) break; } }while(false); return $result; } function readString($fp){ $strLength=readVarInt32($fp); return fread($fp,$strLength); } $types=array( 'VARINT'=>0, 'FIXED64'=>1, 'DELIMITED'=>2, 'START_GROUP'=>3, 'END_GROUP'=>4, 'FIXED32'=>5 ); $rowCount=0; while(true){ $id=fread($pb,1); if($id==='') break; $id=unpack('C',$id)[1]; $type = $id & 7; $id = $id >> 3; switch($id){ case 1: $rowLength=readVarInt32($pb); echo 'row length:'.$rowLength.' '; $end=ftell($pb)+$rowLength; $row=array(); while(ftell($pb) < $end){ $id=unpack('C',fread($pb,1))[1]; $id = $id >> 3; switch($id){ case 1: $row['playtime']=unpack('f',fread($pb,4))[1]; break; case 2: $row['mode']=readVarInt32($pb); break; case 3: $row['fontsize']=readVarInt32($pb); break; case 4: $row['color']=substr(pack('N', readVarInt32($pb) ),2); break; case 5: $row['timestamp']=readVarInt32($pb); break; case 6: $row['poolid']=readVarInt32($pb); break; case 7: $row['hash']=readString($pb); break; case 8: $row['dmid']=readVarInt32($pb); break; case 9: $row['msg']=readString($pb); break; case 10: $row['uid']=readVarInt32($pb); break; case 11: $row['uname']=readString($pb); break; } } print_r($row); $rowCount++; break; case 2: echo '[chat_server] => '.readString($pb)."\n"; break; case 3: echo '[chat_id] => '.readVarInt32($pb)."\n"; break; case 4: echo '[mission] => '.readVarInt32($pb)."\n"; break; case 5: echo '[max_limit] => '.readVarInt32($pb)."\n"; break; case 6: echo '[source] => '.readString($pb)."\n"; break; case 7: echo '[ds] => '.readVarInt32($pb)."\n"; break; case 8: echo '[de] => '.readVarInt32($pb)."\n"; break; case 9: echo '[max_count] => '.readVarInt32($pb)."\n"; break; case 10: echo '[realname] => '.readVarInt32($pb)."\n"; break; case 11: echo '[sectionlen] => '.readVarInt32($pb)."\n"; break; default: switch($type){ case 0: echo '--Unknown ID '.$id.' with varint32 value '.readVarInt32($pb)."\n"; break; case 1: echo '--Unknown ID '.$id.' with fixed 64bit data hex '.bin2hex(fread($pb,8))."\n"; break; case 5: echo '--Unknown ID '.$id.' with fixed 32bit data hex '.bin2hex(fread($pb,4))."\n"; break; default: echo '--Unknown ID '.$id.' with type '.$type."\n"; } } } echo $rowCount.' rows in file'."\n";