也许是年终总结

2017混结束了

是的,我自己感觉这一年就是混过来的

这一年里做了的比较大的项目

  • flvjs mp4 播放
  • 优酷播放器
  • 视频转存
  • acfun 播放器

直播播放器都不能算大项目,说实在轮实用性比不上助手,毕竟我自己也仅仅是偶尔看直播

不过一年真的是能改变很多东西,去年这个时候,我还是选择停留在ff45,用着flash播放器;现在我则是停留在ff56,坚守legacy插件,flash则是几次重装系统之后就再也没有安装过了。明年这时候,谁知道呢,说不定我会离开火狐阵营?(苦笑)

flvjs mp4

反正就像上面说的,去年这个时候,我还并不看好,或者可以说完全不喜欢html5标准,所以起初做出来的播放扩展好像我自己都不用。

然后,随着火狐里的flash越来越难用,我终于是有一天转换了阵营,开始研究无flash。

flvjs魔改之旅,是从添加实时码率统计开始。

添加mp4的过程,模仿着现有的代码,功能完成了,也踩了不少坑,同样也获得了xqq的一些帮助,一些坑直到前不久才刚刚修复。总的而言,主体功能写了三天,难度也不算很高了。

优酷播放器

紧跟着写完flvjs mp4之后,一想到写出这个功能之后,除了自己的play helper之外,就再也没有人用了,就感到心态爆炸,boom,然后脑热就写了这个扩展。

这么个产物至今都不算完美,bug依然很多,我无力处理,也懒于处理。

我用自己扩展的唯一机会:车祸视频,最近一个月也是再没继续看日更,毕竟天天的内容都是差不多的电摩横冲直撞,王者霸气转弯,确确实实容易感到厌倦。

转存b站视频

这个项目可以说是充分体现了我的懒癌了

最早,power在5月份左右就提出了,想要转存全部番剧的想法,并且准备好了google教育账号。我当时以懒得开坑+考试,推迟到了假期。

考完试的那几天晚上,造了php多线程下载的轮子;

然后7月过去了,断断续续写代码,最后在8月初,才开始在几个无限流量服务器上开始跑任务;

由于写出来的代码是单队列,在那几个linux服务器跑起来效率很低,然后8月中旬的时候,power拿了代码,放到了一个win服务器里开始跑并发。

然后…一转眼就是10月了,期间我基本没想起过项目。一次提醒后我才去整理结果数据,然后重跑失败任务之类的。

等到初期任务跑完,已经又是一个月过去了。挂上了中转代理下载之后,我又写了写队列任务,算是正式开放了合并转存。

这个系统也是有几个坑没有填,重置任务状态,转移任务服务器(旧的要弃用,需要换)等等。

acfun 播放器

然后就是ac了

原本暑假有个写播放器的计划,但当时遇到了样式困难,写了半天就坑了。

原本想好的完美简介是“一个B站播放器,送个缺B乐的各位”。但是坑计划之后我加上了yt主题并设为了默认,也是不准确宣传了(笑

说来奇妙,我完全不用ac,也不知道写这为了啥;即使如今写好了,也仅关注了一个steam周报。

虽然完成后确实得到了一些支持,也确实有真切的希望扩展能更好更完美的人。

 

写代码的破事说完了,再说说生活吧。

回到开头,这一年是混过来的

现在处在一个重大抉择的时候,大三了,需要决定自己的方向了。

家里人希望,或者说是要求我考研。本科录取没能进计算机,被调剂到了物理,现在要考当然是希望考进计算机,但心态上始终有着很大问题。

提不起学习动力。

两年多大学,整个人越过越颓废,学业越来越吃力(不如说是没有使劲)。

自己逐渐被懒惰的动物本性拖住,不知如何才能找回高三时的那种冲劲。

也许这就是进入大学前,一直听到别人说,也一直嗤之以鼻的,缺乏目标的现象吧。一直觉得自己不会是那样的,我可是有目标的人;到头来却发现,自己并没有那么特殊。

也或许是看到认识的人都是一种,算是活得风生水起,从而对自己方向感到的一种困惑吧。

这个学期考了两个外语考试,N2和托福,N2出成绩还有一个月,考完看答案估计自己要么擦线过,要么刚好在线下;托福则是考了86,半裸考,不算低,也不算高,考出来什么用都没有的分数。专业课考试也是持续走低,补上一个又挂一个。

 

如果你看到这里了,很抱歉让你看到了一堆牢骚话。

这么个总结,写出来或许仅仅是用来发泄而已。

每一学期开始都希望自己能真正的付出足够努力,却总是在结束时发现,只是又混过了一段日子。

 

12/31 2017

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

//
//  ReplayKitObj.mm
//  ReplayKitObj
//
//  Created by ester on 2017/12/12.
//  Copyright (c) 2017年 __MyCompanyName__. All rights reserved.
//

// CaptainHook by Ryan Petrich
// see https://github.com/rpetrich/CaptainHook/

#if TARGET_OS_SIMULATOR
#error Do not support the simulator, please use the real iPhone Device.
#endif

#import <Foundation/Foundation.h>

// Objective-C runtime hooking using CaptainHook:
//   1. declare class using CHDeclareClass()
//   2. load class using CHLoadClass() or CHLoadLateClass() in CHConstructor
//   3. hook method using CHOptimizedMethod()
//   4. register hook using CHHook() in CHConstructor
//   5. (optionally) call old method using CHSuper()

#import <ReplayKit/ReplayKit.h>


@interface ReplayKitObj : UIViewController
//@interface ReplayKitObj : NSObject<RPPreviewViewControllerDelegate, RPScreenRecorderDelegate>
//@interface ReplayKitObj : UIViewController<RPPreviewViewControllerDelegate, RPScreenRecorderDelegate>

//-(void)startRec;
//-(void)stopRec;
//- (void)previewControllerDidFinish;
@end
//@interface ReplayKitObj () <RPPreviewViewControllerDelegate>
//@end

@implementation ReplayKitObj

+(void)startRec{
    
    NSLog(@"enter");
    
    
    
    
    //UIViewController* rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder;
    
    
    [recorder startRecordingWithMicrophoneEnabled:false handler:^(NSError * error) {
        if(error != nil) {
            NSString* desc = error.description;
            NSLog(@"%@", desc);
            return;
        }
    }];
    
}

+(void)stopRec{
    
    NSLog(@"enter");
    
    [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error){
        NSLog(@"EEEEE");
        if(error){
            NSLog(@"fialed to stop recording, %@", error);
            
        }else if(previewViewController != nil){
            NSLog(@"finish");
            
            previewViewController.previewControllerDelegate = self;
            
            UIViewController *rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
            [rootController presentViewController:previewViewController animated:YES completion:nil];
            
        }
        
    }];
    
    NSLog(@"end");
    
}

+(void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
    NSLog(@"previewControllerDidFinish");
    [[UIApplication sharedApplication].keyWindow.rootViewController dismissViewControllerAnimated:YES completion:nil];
}

+(void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet <NSString *>*)activityTypes {
	NSLog(@"activity - %@",activityTypes);
}

@end


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