なるたるなるなる

メモと日記代わり(私用)

AVFoundation + Swift2 動画中からの指定領域のクリッピング

動画中のあるところの領域を切り出して保存したい.
AVMutableVideoCompositionLayerInstruction.setCrop ~ でクロップし AVExportSession で動画を出力すると, その領域にクローズアップした形で保存されない.

AVMutableVideoComposition に映像トラックを追加し, その renderSize を (100, 100) にすると animationTool で指定した videoLayer の 左上から (100, 100) が描画されることがわかった. frame は 左下が原点なのに。。。
そこで AVMutableVideoCompositionInstruction にAVMutableVideoCompositionLayerInstruction を追加し, Affine 変換で Layer の位置をずらす.

let t = CGAffineTransformMake(1, 0, 0, 1, -1 * cropSize.minX,  -1 * cropSize.minY)
layerInstruction.setTransform(t, atTime: kCMTimeZero)

先の renderSize と併せて意図した Rectangle 内だけを保存できる.

AVFoundation の勉強で作っている
GitHub - naru-hiyoko/TuberKids_AVFoundation: AVFoundation を使った動画編集アプリ. Swift2 を使っている.
では VideoeditController の 462 行目付近で使っている.

Swift マスク画像の生成メモ

マスク画像を用意して画像を切り抜くだけでググって手間取って1日気分悪くなった。 
Bitmap context を用意するの面倒だよね。

       // マスクの元画像
        guard let dataA = NSData(contentsOfFile: "/~~~/fore2.png") else {
            print("No file A.")
            return
        }
        let cgA : CGImage! = NSBitmapImageRep(data: dataA)!.CGImage
        
        // 切り抜きたい画像
        guard let dataB = NSData(contentsOfFile: "/~~~/back2.png") else {
            print("No file B")
            return
        }
        let cgB : CGImage! = NSBitmapImageRep(data: dataB)!.CGImage
        
        // グレイスケールのアルファマスク画像を生成
        let ctx = CGBitmapContextCreate(nil, CGImageGetWidth(cgA), CGImageGetHeight(cgA), 8, 0, CGColorSpaceCreateDeviceGray(),
                                        CGBitmapInfo.AlphaInfoMask.rawValue & CGImageAlphaInfo.Only.rawValue)
        CGContextDrawImage(ctx!, CGRectMake(0, 0, CGFloat(CGImageGetWidth(cgA)), CGFloat(CGImageGetHeight(cgA))), cgA)
        let mask : CGImage! = CGBitmapContextCreateImage(ctx!)

        assert(CGImageIsMask(mask))
        let crop : CGImage! = CGImageCreateWithMask(cgB, mask)
        
        // 表示 保存
        self._imageView.image = NSImage(CGImage: crop, size: NSSize(width: 300, height: 300))
        let __data = NSBitmapImageRep(CGImage: crop).representationUsingType(NSBitmapImageFileType.NSBMPFileType, properties: [:])
        __data?.writeToURL(NSURL.init(fileURLWithPath: "/Volumes/ramdisk/test.bmp"), atomically: true)
        

SlingBox をLANで動かす

たまーにテレビ見たくなる.
しかし、テレビがない.
パナソニックのレコーダー DMR-BR570とSlingBox Pro-HDが転がっているぞ.
しかもD端子からHD画質でつなげるぞ. Macで見よ
ただ待てよ、見るだけでSlingBoxがWANを経由するのは気持ち悪いしキャッシュの設定もできない..

Slingbox Capture ? 素晴らしい!
https://sourceforge.net/p/kmttg/wiki/slingbox_capture/

kmttg_v2.zip をダウンロード&展開
PerlのCrypt-Tea_JSモジュールが必要なのでインストール
pro & pro-hd は rec2a.plが本体か..
slingboxのadminパスワードはsling account にログインした状態で

https://newwatchsecure.slingbox.com/watch/slingAccounts/account_boxes_js
を開くとpassみたいのが確認出来る.

cpan install Crypt::Tea_JS
unzip kmttg_v2.1s.zip
cd slingbox
# pass はslingboxのadminパスワード
perl rec2a.pl rec2a.pl -ip 192.168.0.254 -hd 1  -pass *** -stdout

エラー無く生データが流れたら問題なし. C^cで止める.
標準出力でなくファイルへ書き出すには

perl rec2a.pl -ip 192.168.0.254 -hd 1  -pass *** -output test.asf 

などして保存したファイルを vlc などで開くとそのまま再生される.

今回は垂れ流したいだけなので homebrew で mplayer をインストールした.
このmplayer最高なんだけどダウンロードができなかったり, ビルドに失敗したりと厄介.
ソースコードからビルドが賢明か?

brew install mplayer
./rec2a.pl -ip 192.168.0.254 -hd 1  -pass *** -stdout | mplayer -x 1920 -y 1080 -framedrop -fps 30 -cache 3000 -

cacheの値は重要.

日本語フォントから文字画像を保存する

メモ
pygame が便利っぽいけど使い方がわからない。

#encoding: utf-8

import sys
import pygame
import os
from pygame.locals import *
from pygame import freetype
from PIL import Image
import numpy as np

white = (255, 255, 255)
black = (0, 0, 0)
red = (188, 0, 0)

def save_screen_img(pg_surface, fn, quality=100):
    imgstr = pygame.image.tostring(pg_surface, 'RGB')
    im = Image.fromstring('RGB', pg_surface.get_size(), imgstr)
    im.save(fn, quality=quality)
    print fn
    
global gameDisplay

if __name__ == '__main__':
    sz = (800, 200)
    pygame.init()
    gameDisplay = pygame.display.set_mode(sz)
    pygame.display.set_caption('test')

    text = '日本語もできる'
    text_length = int(len(text)) / 3

    
    bg_surf = pygame.Surface((200, 100), SRCALPHA, 32)
    bg_surf.fill(white)
    bg_rect = bg_surf.get_rect()
    bg_rect.center = (400, 100)

    font = freetype.Font('JKG-L_2.ttf', 20)
    font.underline = True
    rect = font.get_rect(text.decode('utf-8'))
    rect.center = (100, 50)

    font.render_to(bg_surf, rect, text.decode('utf-8'))
        
    clock = pygame.time.Clock()

    while True:
        white = (255, 255, 255)
        gameDisplay.fill(white)
        gameDisplay.blit(bg_surf, bg_rect)
        for event in pygame.event.get():
            
            if event.type == pygame.KEYDOWN:
                save_screen_img(bg_surf, 'hello.jpg')
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        pygame.display.update()
        clock.tick(60)

優秀な後輩とどうコミュニケーションをとるか?

スキルや学力にギャップがある場合、コミュニケーションが取りづらい場合がままある。
これまで気にしたことがない問題だったが立場上、先輩という立場になると辛いことがわかった。
この春、優秀な学業成績を収めてきた後輩が配属されてきた。
彼らでも分からないことはあるらしく質問にやってくる。所詮、私はパンピーなのでこれまでの経験の範囲でしか答えられない。
彼らの問いに対して十分な返答ができたとは思えない。毎回冷や汗ものだ。
なので心理的にどうしても遠くに行ってしまいたくなる。
しかし、考えるとせっかくの優秀なブレインとの交流の機会を損失してしまう。これは自分の経験を増やす目的で大損をしている。
もう少し様子を見よう。できる限り協力の姿勢を見せておくで将来役に立ってくれるだろう。