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)
今日は12時間活動しました
朝の9時からセミナーを受けて2コマ授業を受けた。
どうも自分が社会に出られるか不安です。
今日は疲れる案件が多くて大変。周囲と自分を比較するのはやめてのんびりプログラミングで遊びます
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)
優秀な後輩とどうコミュニケーションをとるか?
スキルや学力にギャップがある場合、コミュニケーションが取りづらい場合がままある。
これまで気にしたことがない問題だったが立場上、先輩という立場になると辛いことがわかった。
この春、優秀な学業成績を収めてきた後輩が配属されてきた。
彼らでも分からないことはあるらしく質問にやってくる。所詮、私はパンピーなのでこれまでの経験の範囲でしか答えられない。
彼らの問いに対して十分な返答ができたとは思えない。毎回冷や汗ものだ。
なので心理的にどうしても遠くに行ってしまいたくなる。
しかし、考えるとせっかくの優秀なブレインとの交流の機会を損失してしまう。これは自分の経験を増やす目的で大損をしている。
もう少し様子を見よう。できる限り協力の姿勢を見せておくで将来役に立ってくれるだろう。
im2colと畳み込み
勉強会で使わなかったスライド。
もったいないので。