perlでMP4やMOVの縦横サイズを取得する

タイトルのまんまのエントリ。
動機としては、ウチのおひとり様ActivityPubサーバーに動画をアップロードしてみたい。
んで、ActivityPubサーバーは、フォロワーさんのところに投稿(ActivityのJSON)を配送するんだけど、この時に縦横のピクセルサイズが必要っぽい。
動画を扱う時に、鉄板の定番のffmpegでサイズ取得も当然、ほかに解像度変更やファイルサイズの圧縮とかいろいろできるんだけど、レンタルサーバーでffmpegを使えるという話を見たことがなく、当然わたしが利用しているロリポップも使えない。
となると、縦横のピクセルサイズは自力でなんとかする必要がある。
ぐーぐる先生に聞きまくってなんとかなったのでメモ。
「MP4のファイル構造を解説」
https://qiita.com/satken2/items/d14b4113fe3fb5f5597b
↑こちらのサイトで一発解答(多謝!)
MP3とMOVファイルは基本3つのブロックの塊らしい。
サイズ | タイプ名 | データ |
4バイト | 4バイト | 可変 |
最初の4バイトに入ってるサイズでブロック全体の長さがわかる。
BOXの長さの情報が2^32バイト(=4294967296)を超える場合、最初の4バイトには0x00000001が格納され、その変わりに9バイト~16バイトに実際のBOXの長さが書かれます
ということだけど、今回わたしの場合は10秒もないようなSNSに上げるためだけの動画なのでスルーする。
そのブロックにもろもろの情報が入っているので、欲しいところを取得する。
このブロックのタイプはいったいなんなの?というのは
「QuickTime File Format」
https://developer.apple.com/documentation/quicktime-file-format#//apple_ref/doc/uid/TP40000939-CH204-SW1
↑こちらに全部ある。
ここまでわかればやることはわりと単純。
1)最初の4バイトをみてブロックサイズを取得
2)次の4バイトをみてブロックのタイプを取得
3)必要なタイプだったらそこで情報を取得して終了
必要なタイプじゃなかったら次のブロックをみにいく
ちょっとハマったのが
各ブロックはデータを持たないものと持ってるものがあるということ。
しょうがないんで、次のブロックを先読みしてタイプ名があるかないかで判定。
以下で欲しい情報が取れた。
わたしが欲しいのはタイプ「tkhd」(たぶん、トラックヘッダーの略)のブロックのデータ部に入ってる幅と高さ。
my @parent = (
'cmov', 'ctts', 'edts', 'esds',
'free', 'ftyp', 'iods', 'junk',
'mdia', 'minf', 'moov', 'mvhd',
'pict', 'pnot', 'rmda', 'rmra',
'skip', 'stbl', 'trak', 'uuid',
'wide');
my @child = (
'fiel', 'mdat', 'rdrf', 'rmcd',
'rmcs', 'rmdr', 'rmqu', 'rmvc',
'wfex', 'cmvd', 'co64', 'dcom',
'elst', 'gmhd', 'hdlr', 'mdhd',
'smhd', 'stco', 'stsc', 'stsd',
'stss', 'stsz', 'stts', 'tkhd',
'vmhd');
open(IMG, $file) || die;
binmode IMG;
my $len; my $type; my $data;
my $width; my $height;
while(1){
my $buf;
read(IMG, $buf, 4);
$len = unpack("N", $buf);
read(IMG, $type, 4);
last if ! $type;
# check next type
my $has_data;
seek(IMG,4, 1) || last;
read(IMG,$buf,4);
last if ! $buf;
$buf = quotemeta $buf;
unless( grep(m!$buf!, @parent) || grep(m!$buf!, @child) ){
$has_data = 1;
}
seek(IMG, -8, 1);
if( $has_data ){
$len -= 8;
last if $len < 0;
my $begin = tell(IMG);
read(IMG, $data, $len);
}
if($type =~ m!tkhd!){
my @check = unpack("x76 n x2 n", $data);
if( $check[0] && $check[1] ){
$width = $check[0]; $height = $check[1];
last;
}
}
}
perlはやっぱり凄くて、バイナリファイルも簡単に扱うことができる。
とはいえ、それを扱うスキルがない人間のせいでずいぶん時間がかかってしまった。
これでうちのActivityPubサーバーに動画をあげるための下準備はできた!
…と思ったんだけど、動画ファイルって5秒ぐらいのものでも1M〜2Mもあって慌てた(今さら
わたしはロリポップのビギナーコース。そんなでかいファイルを気楽に上げてたらあっという間に利用できるディスクスペースを食い尽くしてしまう。
なもんで、ここまで作ったけど諦め。きっとそのうち何かの約に立つ、こともある、かな。
今の時期、まじでタケノコ美味くて悶絶する。
刺身で美味いのはもちろん、焼きタケノコがもう絶品。
水分を飛ばすイメージでじっくり弱火のフライパン。水分が飛んできたかなと思ったらオリーブオイルを回しかけてタケノコに焼きめをつけて、塩をふたふり。
これだけでいくらでもご飯が食えるし酒が飲める。
マジでオススメ!!!
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
年金請求手続きに行ってきた

今日、初めての年金請求手続きをしてきた。
エントリにするほどではないんだけど、いつなにをやったか自分で見返すためのメモ。
地元の年金事務所。相談に行くにあたっては事前に予約が必要で、2/7に電話相談窓口に電話して予約が取れたのが今日3/14。1ヶ月以上先の予約でびっくり。それだけ混み合ってる。
電話をしたときに年金請求申請書の記入箇所でわからないこと聞きまくってとりあえず埋めておいた。
当日、というかまさに今日、請求手続きに必要なものは
・マイナンバーカード
・振込先銀行の通帳かキャッシュカード
・雇用保険番号の記載された紙
の、3つ。
事前に調べてたら戸籍謄本が必要だとか住民票が必要だとか言われてたけど、
・本人のマイナンバーカードがある
・申請書の配偶者のマイナンバーを記入する欄が埋まっている
であれば、謄本も住民票も不要。
わからなかったのが配偶者加給だったけど、とりあえず記載しておいたらそれもOKだった。
…ていうか、相談窓口に予約を入れて来所すれば、そこで事細かく説明があって、その場で記入して完成するから杞憂だった。
ということで、満額じゃないけど64歳からの特別支給老齢年金の受給が始まることとなった。
40年以上働いていて、厚生年金、国民年金を払い続けてきたんで、今度は受け取る側になった、ということだ。
支給されるという、そこに示されてる金額、
を!すげー!40年も働いただけはあったな!と一瞬思ったんだけど、それは「月額」じゃなくて「年額」という現実。
アルバイト、パートもやってかないとなあ。
金額はともかく。
一定した収入が確保できる状況というのはいろいろありがたいもんだなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
デジカメ散歩のページを作った

3月だというのに雪でびっくり。
そういえば、ホームページの方にデジカメ散歩のページを作ったのでこちらでもお知らせ。
ウォーキングのモチベーションにと思ってデジカメを持ち歩き。パシャパシャ撮ってる。
だいたい1日1万歩を目安にして隣駅のスーパーまで歩いたり、川沿い、土手のウォーキング/サイクリングコースを歩いたり、1月からかなり歩くようになった。
写真の絵になりそうなのがないかキョロキョロしながら歩いてるので、歩く速度はまったり。
ホームページに月イチで撮った写真を公開するページを作った。
お散歩デジカメ日記::On Golden Pond
https://www.doncha.net/toydigi.html
1ページに写真1枚。日付順。
それなりに考えて
・1ページに表示するのは1枚だけ。
・写真は長辺1080pxに縮小。
と、表示が重くならないようにしたつもり。
多い日だと一日で50枚ぐらいで、0枚の日もある。写真を撮らなければならない、と義務感で撮ると続かないし、気楽手軽にウォーキングのついで、というスタンスで。
撮った写真をPCに移して、後日まとめて掲載する写真の選択とキャプションつけ。
ほぼほぼKODAKのPIXPRO FZ45で撮った写真で、噂どおり色が湿気を帯びて濃厚に見える写真もあって、ページに掲載する写真を選ぶ時間が楽しい。
撮ったままの無編集、水平垂直が取れてないものや露出オーバー/アンダーなものもあるけど、それでもそのまま掲載してる。フォトショあたりでいじり始めるとキリがないしねえ。
ウォーキングというか徘徊の記録なので、あまりそこはこだわらない。
「タ、タスケテ」と聞こえたので駆けつけたけど手遅れだった。なにかに樹に変えられてしまった人間がそこに立ち尽くしていた。
てなキャプション。こんなのを見つけるのもカメラを持ち歩いてるから。いつもの景色の中にいろんなものが潜んでる、発見があるよねえ。
還暦過ぎたらウォーキングと写真ですなー。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ライスワークの終了

年金受給も始まることだし、ライスワーク、食うためだけの仕事を辞めた。
本作りに関わる仕事をライフワークとしてやってるけど、それだけじゃ食っていけないので食っていくためだけのライスワークも並行してやるしかなかった。
そんなこんなで、いろいろライスワークをやってきて。
データベースの基礎や考え方を勉強する機会があったり、中学高校受験やイベントについて知らなかった世界があったり、障がいのあるひとたちの環境について初めて知ったり、自分のスキルや知見に繋がる・広がることは興味もつきなくて、面白かった。
だけど。
なにが目的なんだか。手順を守ることが仕事である、みたいな仕事現場があって呆れるしかなかった。
仕事としてそういうのも「あり」なんだろうけど。
たとえば「毎日9時に花壇にジョウロで水をやること」と言われて、雨の日でも傘をさしながら花壇にジョウロで水をやるような仕事。
頭が悪いだけでただただ阿呆くさい。
今日は雨だし花壇に水をまく必要もない、ということで水をまかなかったりするのは、それを勝手に判断しちゃいけないらしい。おれさまに判断を仰げ、というくだらないヒエラルキーのサルがそこにいる。それがITの仕事というんだからなんじゃそれ、としか。
その組織内のピラミッド構造にしがみつくしかない能無しがそれなりのポジションでふんぞり返る、文字通りのサル山だった。
そんなところにいても、1mmも自分のスキルアップ、レベルアップにならない。ただ時間の無駄。
そんなライスワーク現場もあった。
体力的にも時間で身柄拘束されてチームで仕事することがストレス。
この歳で身体を壊したらもろもろ終了だし、健康第一、ストレスのない環境を自分で選択・作ることが最優先。
てことで、ライスワークはもう止め。
今後、食っていけなくなったらそれでも考えなきゃいけないだろうけど、サル山な現場だけは勘弁してもらおう。サル山の会社ごっこには虫酸が走る、ストレスでしかないからなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ゴッドファーザーふたたびみたび

なんかまたDVDで流してたり。
20年以上前にハマりまくって、ウチに帰るたび、毎日毎晩DVDを流しっぱ。コッポラが時系列順に再編集したレーザーディスクを流しっぱという時期があった。
掛け値なしに100回以上は観ている。
いまどきだと家父長制とかジェンダーとか男社会とか言われちゃうんだろうけど。
お父さんが家族のためにめっちゃ頑張る、お兄ちゃんが妹のためにめっちゃ頑張る、家族の話で、これってたぶん時代とか性別とか関係ないんじゃないかな。
家族の話ということでは、お母さんでもお姉さんでも置き換え可能だし。
とかいうのと。絵面が構図や色使いが、いわゆるレトロってやつ。
いま、ハマってるコンデジで撮った写真なんかと同じ雰囲気。
質感が艶っぽい。コントラストが濃かったり、浅く飛び気味だったり。絵の表情が豊かというか、なんだよなあ。
これはカメラの腕なのか編集の腕なのか、うっとり魅力的。
昭和平成回帰を起こしてるわけで、歳食ったなあ、というのをこんなところでも実感。
ちなみに100回以上観てるんで、英語なんかわからなくても、何を言ってるかわかる。あ!あのシーンか!と字幕いらずでB.G.V.にできるんだわ。
今さらゴッドファーザーかよ、とか言われると思う。
でも、古典、今も生きてる映画はどれもこれも理由があるから残ってるわけで、古いからという理由で観ない理由にはならない。
時間があったらぜひ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
業務効率化ツールの悪弊

いや、なんのこっちゃなんだけど。
業務専用、業務に特化したツールというのがあって。
やってることは「WEBページ用のHTMLを吐き出す/データ抽出用のSQLを吐き出す」だったり。
ミスなく業務をこなしていくため、誰でも業務に入ることができるように、ということでこれらのツールを使えばまず間違いは犯さず仕事に支障を来さずやっていける。これがないと作業時間コストがかかりすぎるし、ひとのやることなので必ずどこかでミスが出る。
実際、業務専用で効率的だし、本当に便利で感心してしまう。
とはいえ。
これらのツールはマニュアルどおりにポチポチ入力したりコピペしたりするだけ。こんなものは、よく躾けられた犬にでもできる作業。猿にでもやらせりゃいい仕事だ。
仕事としてはこれで問題はないけど、ひとの成長機会を奪っている。
ひとを馬鹿のままにしてしまう。
業務ツールの使い方に精通したところで、そこの現場だけの話。よそに行った時に通用するわけがない。その現場にしがみつくしかない能無しを量産することになってしまう。
ツールの吐き出すHTMLやSQL、それらが何をしているのかを考えて、ツールを使わずにHTMLやSQLを書けるスキル・知識を身につければどこに行っても通用する。せっかく仕事で関わることができてるんだから、ただただ言われるまま業務ツールを使ってるだけじゃもったいない。
終身雇用、定年まで勤め上げる、なんて時代じゃない。
いつどこに移っても/独立しても、自分のスキルでやっていけるようにするのが今の時代ってヤツだろう。
以前関わってたITベンチャーだとその手の業務ツールを使いつつ、定期的に若手を中心に勉強会が開催されて意欲さえあれば基本的な知識を学ぶ機会があった。
「言われたことを言われた通りに」という文化風習風土のところだとそんな機会さえ与えられない。業務ツール外の知識を得てしまうとよけいなことをしたりして仕事でミスが出る、ということらしい。
もっとも当人の意識の問題だから、やる気さえあれば各自勉強をして「スキルアップ」すればいいだけの話。
組織内「キャリアアップ」なんかじゃない。個人の「スキルアップ」こそが自分を助ける。
自分の向かう方向を複数から選択できるようしておくために、自分の身につけたスキルが大事だ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」