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

2025/4/21 [17:44:28] (月) 天気

タイトルのまんまのエントリ。

動機としては、ウチのおひとり様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もあって慌てた(今さら

わたしはロリポップのビギナーコース。そんなでかいファイルを気楽に上げてたらあっという間に利用できるディスクスペースを食い尽くしてしまう。


なもんで、ここまで作ったけど諦め。きっとそのうち何かの約に立つ、こともある、かな。


image


今の時期、まじでタケノコ美味くて悶絶する。

刺身で美味いのはもちろん、焼きタケノコがもう絶品。

水分を飛ばすイメージでじっくり弱火のフライパン。水分が飛んできたかなと思ったらオリーブオイルを回しかけてタケノコに焼きめをつけて、塩をふたふり。

これだけでいくらでもご飯が食えるし酒が飲める。

マジでオススメ!!!

kindleの無料販売10日間

2015/4/21 [09:39:24] (火) 天気
image

プライスマッチ適用で『酒を片手に庭に出る』をkindleでも4/10より無料販売を開始。10日間経過。


グラフのピークは無料開始直後の日曜日。

無料販売開始が、たまたま週末でユーザー数が多かったおかげか、この日だけで200近いDL。

無料ランキングも最高で13位(無料ランキングの1ページ目)になった。

image

その後、ぱったり止まるかと思っていたら、そうでもなく、今のところはコンスタントにDLされ続けているようだ。

これによって有料作品の販売数が上がってくれたら「プロモーション・販促」としての無料配布の意味・意義はあるんだろうけど、今のところ変化はないなぁ。


楽観的なことを言うと。

「とりあえず無料だしDLしておこう、そのうち読むかも」というパターン。

同人誌即売会などで無料配布をもらっても、わたしの場合は「金を払って買ったもの優先」で、無料モノはどうしても後回しになってしまう。まだ10日しか経ってないし、そのうち読んでもらえて結果に繋がればいい。


3日間という期間限定の無料キャンペーンと違って、プライスマッチの無料販売はずっと無料で配信できる。

せっかくなんだから関連するサイトなどで積極的に「プロモーション・販促」として利用すべきだろう。有料作品への動線なんかもたぶん工夫しなきゃいけない。


ちなみに「SF・ホラー・ファンタジー」カテゴリのランキングは今日時点1位。

image

このカテゴリ、無料作品が10もないからですな。


[2015/04/23 16:15:08] ということで、こちらでも公開します。

[BiB:free-shortstories:酒を片手に庭に出る]

酒を片手に庭に出る [Kindle]

『酒を片手に庭に出る [Kindle]』

日野裕太郎

[更新]2026-02-01 09:34:26

Ajaxの使い過ぎ

2014/4/21 [17:02:54] (月) 天気

この雑記帖にはいたるところにAjaxのコンテナがある。本文を少しでも早く表示させようという意図で、本文以外のこれは後でいいだろうというコンテンツをajaxでの取得&表示に切り替えて行った。

予想通り効果的で体感実測(ストップウォッチ計測)で10秒近くスピードアップに繋がった。


…のはいいんだけど。

調子こいて片っ端からajaxにしたもんで、ふと気づいたら、記事で見せたいコンテンツがajaxコンテナだったりしてびっくりすることになった。絵に描いたような本末転倒。


(困ったことに)ヒマなので、Ajaxコンテナを見直し、静的に生成した(キャッシュ)部品に切り替えることにした。ついでに1ページ表示件数を10件から6件に減らして様子見。


目先の効果に飛びついて、運用していくうちに、あれ?これって?という賽の河原仕事。業務でシビアな環境にいれば気づくことなんだけど、連日格闘してたのはもう5年も前になるのでカンも鈍ったボケ老人状態。

厳しく自分を律することができるならともかく。ストレスフリーの独学独習・環境はやっぱりひとをダメにする。ストレスのかかったところで「このクソが」などと罵りながら仕事として関わらないと、だ。


もう4月も終わろうとしてる。いろいろ見直さないといかんなぁ。


[更新]2026-02-01 12:52:26

だったらお前がやれよ

2013/4/21 [19:06:53] (日) 天気

「こうすれば売れる」「読者を掴むためにはこんな方法がある」


てな記事、言説にはうんざり。いや、ひとさまの商売の邪魔をしちゃいけないなあ、と思うし、他人を否定するようなことをいうと自分に跳ね返ることが多いし、運気が下がりそうなので言いたかないけど。


タイトルどおり「だったらお前がやれよ」ということってどうなの。それもドヤ顔で。


特にまだ若い電子書籍界隈では、こうすりゃ売れる・こんな書き方構成にすべきである、なんてのがわさわさ湧いていてうんざりするばかり。


自分の成功例を元に騙る・語るならいいけど、キミだれ?なんか売れてるものあるんだっけ?というのが何かを言ってても説得力ゼロじゃないのか。

(はっきりと正解があるようなものなら別だし、カウンセリングのように寄り添う形で一緒にやるようなものはまた別)


小説の書き方なんて作家さんで違う。「売れる書き方」なんてありえない。出版社や業界都合で今この時売れているものはあるけどその通りにやったところでどうなの。


元底辺エロ出版社のチンピラ編集者程度でエラソなことは言えないけど、少なくとも20年は編集者としてやってきた。

漫画家さんが、売れてる漫画家さんのレプリカのような原稿を持ってきた時は、割と真面目に怒った。


「悪いけどコレはいらない。だったらさ、ギャラ積んで××センセに頼めばいいだけだよ?あなたに頼む意味ないよね」


もちろん。好きな作家さんがいて憧れて、好きな作品があって、自分もあんな風に書きたい、あんなのを描きたいと思って描くのは、誰しもスタート地点。

だけど、売れなくて思い悩んで、そっくりそのまま(キャラやストーリー、コマ割)やっちゃ、いったい何のために描いてるんだ?と。


読者からの反応なんてあれば超ラッキーで、ないのが当たり前、本を出してみて数字になって初めてわかる。指針・指標などなく暗中模索・五里霧中、それでも描きたい・書きたいという意思の力が必要で、それを才能という。


なので、作家・クリエイターを尊敬するし、応援していたい。


[04/21 22:00:28] 追記。

いや、奇麗ごとじゃなく。

ぶっちゃけ、売れセンの模倣、目先の2〜3本はありがたいんだけど。単行本ラインナップに入ってもらおうと思ったら、レプリカだと2冊も続かない。それだと商売としてよろしくない、ということがあった。


[更新]2026-02-02 07:42:32

日野裕太郎作品立ち読みサンプル増量

2013/4/21 [16:04:16] (日) 天気

日野裕太郎の作品の一部ですが、立ち読みサンプルを増量しました(PC版のSafari、chrome限定)


各々リンク先で、小説の50%〜70%ほど読めます。


ホラー

『おかえりください』(表紙:おおぬまひろし)

『いつもの夕餉』(表紙:おおぬまひろし)

『梅の選択』(表紙:おおぬまひろし)

ヒューマンドラマ

『アロイのやさしい神さま』(表紙:ハルノブ)

『水影に赤をきく』(表紙:ハルノブ)

サスペンス

『あかるいほうへ』(表紙:にくきうー)

ファンタジー

『水に咲く花』(表紙:ハルノブ)


日野裕太郎って誰?聞いたことないけどどうなの?

けっこう面白いかもしれません。ぜひ立ち読みしてやってください。


本編は kindleストア と ibookstore にて絶賛発売中です〜!


ほか、日野裕太郎作品のレビューはこちら→ http://t2aki.doncha.net/?id=1360323148



しかし。今日時点で、cssのwriting-modeでの縦書き表示ができるのはSafariとChromeだけということに愕然…なんかなあ。

[更新]2026-02-02 07:42:48

<<2026/04>>
   1234
567891011
12131415161718
19202122232425
2627282930

【最近の10件】

日常読書映画アニメゲーム健康料理グルメカメラ写真ネタ仕事パソコンインターネットperlEPUB3電子書籍ActivityPub
検索: