Blog

  • バイナリエディタで .mov を回転

    先日、携帯で QuickTime の .mov 動画を撮ったら、90°傾いて撮れてしまいました。iPhone 3GS のカメラでは、ときどき向きがおかしくなります。.mov を .mov のまま90°回転する無料のソフトを探したものの見つからず、直接バイナリエディタで向きを書き換えてみました。

    以下、自分用のメモです。たまたまうまくいったように思えるだけで、実はファイルがめちゃくちゃに壊れているかもしれませんのであしからず。

    要約

    1. iPhone 3GS で撮影した QuickTime の .mov ムービーを前提とする。
    2. 元の .mov ファイルは保存して、コピーした .mov ファイルをバイナリエディタで開いて編集。
    3. 文字列 ‘moov’ を検索。その下の文字列 ‘mvhd’ を探す。ファイルの下の方にあるはず。
    4. Figure 2-3  The layout of a movie header atom | QuickTime File Format Specification: Movie Atoms を参考に、アフィン変換の行列、Matrix structure (a, b, u, c, d, v, x, y, w) を見つける。w の 40 00 00 00(16進) の並びが目安。
    5. The Transformation Matrix | QuickTime Movie Creation Guide: Creating Movies の回転行列の式を参考に、(a b c d) を書き換える。x軸は右向き、y軸は下向き、角度は時計回りが正。固定小数点 16.16 形式なので、1 なら 00 01 00 00、-1 なら ff ff 00 00 。90度ごとの回転なら、値は 0 か 1 か -1 の組み合わせとなる。よく見かける回転行列の転置行列になっている。
    6. 再生してみて、希望通りに回転していれば O.K. のはず。
    7. (ファイルによっては、ほかの ‘mvhd’ のところの (a b c d) を書き換える必要があるかもしれない)

    詳細と雑談

    ランドスケープ(横長)のつもりで撮影したのに、ポートレイト(縦長)で記録された映像:

    このファイルをバイナリエディタで開きます。直接書き換えるので、オリジナルのファイルは保存、コピーした作業用のファイルに対して操作します。無理やり操作するので、たいてい何回も間違えます。さて、QuickTime ムービー (.mov) ファイルの構造を仕様書で調べます。

    まず、書き換えるべき値 Matrix structure の目印の文字列を探します。

    より、バイナリエディタで Movie atom の文字列 ‘moov’ を検索し、すぐ下の Movie header atom の文字列 ‘mvhd’ を探します。(今回扱っている動画ファイルの場合、ヘッダと言いつつ、頭のほうではなくファイルの一番下の方にあります。’mvhd’ だけで検索すると、上の方にもありますが、こちらを書き換えても動画の向きは変わりませんでした。)

    20130731a_mov_bin_moov 20130731c_mov_bin_mvhd

    文字列 ‘mvhd’ がある Movie header atom の構造は、

    qt_l_095 (図:同上より)

    この Matrix structure のうち、[a b c d] を使って回転します。文字列 ‘mvhd’ があるのが Movie header atom の5~8バイトめ。次の Version から Reserved まで 1 + 3 + 4 + 4 + 4 + 4 + 4 + 2 + 10 ( = 36 )バイトあるので、Matrix structure の要素 a の先頭は ‘mvhd’ の ‘d’ の次から 37 バイト目です。こんな感じにがんばって数えていくと、この .mov ファイルの場合は

    20130731e_mov_bin_matrix_org
    a = &h 00 01 00 00 = 1.0
    b = &h 00 00 00 00 = 0.0
    u = &h 00 00 00 00 = 0.0
    c = &h 00 00 00 00 = 0.0
    d = &h 00 01 00 00 = 1.0
    v = &h 00 00 00 00 = 0.0
    x = &h 00 00 00 00 = 0.0
    y = &h 00 00 00 00 = 0.0
    w = &h 40 00 00 00 = 1.0

    $$  \left( \begin{array}{ccc} a & b & u \\ c & d & v \\ t_x & t_y & w \end{array}\right) = \left( \begin{array}{ccc} 1.0 & 0.0 & 0.0 \\ 0.0 & 1.0 & 0.0 \\ 0.0 & 0.0 & 1.0 \end{array}\right) $$

    となっています。各 4 バイトは固定小数点で、a, b, c, d, x, y は 16.16 ビット、u, v, w は 2.30 ビットの区切りです。行列と数値の形式は次の通り:

    qt_l_054 (図:同上より)

    アフィン変換というもので、一次変換と平行移動を同時に表現しているそうです。

    QuickTime では、高校数学の回転行列や一次変換で見慣れた行列の形式と違って、その転置行列で表現しているようです。

    このへんのことは、別の文書にもう少し詳しく書いてありました。

    によると、平面の x 軸、y 軸の向きは

    track_trans_movie_coord (図:同上より)

    となっているようで、y 軸が上でなく下に向いています。

    によると、常に u = v ≡ 0.0 、w ≡ 1.0 と書いてあります。つまり w は常に &h 40 00 00 00 となります。変換行列の末尾に必ず 40 が現れるので、これが探す目安になります。

    回転行列のところでは、

    rotation_matrix (図:同上より)

    角度が q、θ、A と混乱していますが、同じ文字の誤植でしょう。また、回転の向きが反時計回り counterclockwise に角度 q と書いてありますが、その逆で、画面を見る人から見れば時計回りと考えられます。一般的な平面座標では x 軸が右向きで y 軸が上向きであり、x 軸から y 軸に向かう方向となる反時計回りが角度の正の向きです。しかし、QuickTime のように y 軸が下向きならば、x 軸から y 軸に向かう方向となる時計回りが正と考えるのが自然です。式の形からも、そうでないとおかしいでしょう。

    さて、画像の中心が原点なら平行移動は不要なので、回転は (a b c d) の組だけ考えればいいはずです(原点は左上ではないかと思うのですが、勝手にセンタリングしてくれるようです)。

    問題の映像ファイルの回転に関わる数値だけ行列で抜き出すと、

    $$ \left( \begin{array}{cc} a & b \\ c & d\end{array}\right) = \left( \begin{array}{cc} 1.0 & 0.0 \\ 0.0 & 1.0\end{array}\right) $$

    $$ \left( \begin{array}{cc} x^\prime & y^\prime \end{array} \right) = \left( \begin{array}{cc} x & y \end{array} \right) \left( \begin{array}{cc} a & b \\ c & d\end{array}\right) = \left( \begin{array}{cc} x & y \end{array} \right) \left( \begin{array}{cc} 1.0 & 0.0 \\ 0.0 & 1.0\end{array}\right) = \left( \begin{array}{cc} x & y \end{array} \right) $$

    つまり、単位行列です。90°回転されているようにみえるこの映像は、内部的に QuickTime のファイルとしては回転されていませんし、ほかの変換(マッピング)もされていません。

    試しに、x と y を入れ替えるような行列にすると、

    $$
    \left( \begin{array}{cc} x^\prime & y^\prime \end{array} \right)
    = \left( \begin{array}{cc} x & y \end{array} \right) \left( \begin{array}{cc} a & b \\ c & d\end{array}\right)
    = \left( \begin{array}{cc} x & y \end{array} \right) \left( \begin{array}{cc} 0.0 & 1.0 \\ 1.0 & 0.0\end{array}\right)
    = \left( \begin{array}{cc} y & x \end{array} \right) $$

    w の &h40 を目安に、その上の方の &h01 の2カ所をバイナリエディタで探して、それぞれ別の場所に書き換えます。

    20130731d_mov_bin_xy-yx

    90°の傾きは解消しましたが、天地が反転した映像になりました。駅名の文字も裏返っています。この動画を、さらに y’ を反転させればよさそうです。

    $$
    \left( \begin{array}{cc} x^\prime & y^\prime \end{array} \right)
    = \left( \begin{array}{cc} x & y \end{array} \right) \left( \begin{array}{cc} a & b \\ c & d\end{array}\right)
    = \left( \begin{array}{cc} x & y \end{array} \right) \left( \begin{array}{cc} 0.0 & -1.0 \\ 1.0 & 0.0\end{array}\right)
    = \left( \begin{array}{cc} y & -x \end{array} \right) $$

    20130731h_mov_bin_rot90

    -1.0 は整数部を2の補数にして &h ff ff 00 00

    映像の最後のほうで駅のホームの文字が読めるので、裏返しにはなっていません。空と海の位置関係から上下も合っています。正常に反時計回りに 90° 回転できたように思われます。’mvhd’ で検索するともう一ヵ所あるので、そちらも直すべきなのかもしれませんが、今回は放置しました。ともかく、これで書き換えは成功したということにします。

    さて、よく見かける回転行列は、角度をθとして

    $$
    \left( \begin{array}{c} x^\prime \\ y^\prime \end{array}\right)
    =\left( \begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right)
    \left( \begin{array}{c} x \\ y \end{array}\right) $$

    ですが、QuickTime では転置した形で書いてあるので

    $$
    \left( \begin{array}{cc} x^\prime & y^\prime \end{array}\right)
    =\left( \begin{array}{cc} x & y \end{array}\right)
    \left( \begin{array}{cc} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \end{array}\right) $$

    です。Matrix structure(アフィン変換)全体も同じく転置行列になっています。

    反時計回りに 90° 回転するとき、上述のように時計回りが正なので θ = -90° 、QuickTime の方の式で

    $$
    \left( \begin{array}{cc} x^\prime & y^\prime \end{array}\right)
    =\left( \begin{array}{cc} x & y \end{array}\right)
    \left( \begin{array}{cc} \cos (-90) & \sin (-90) \\ -\sin (-90) & \cos (-90)\end{array}\right)
    =\left( \begin{array}{cc} x & y \end{array}\right)
    \left( \begin{array}{cc} 0 & -1 \\ 1 & 0 \end{array}\right)
    =\left( \begin{array}{cc} y & -x \end{array}\right) $$

    試行錯誤的に成功したときの行列と一致します。回転方向が普通と逆で時計回りが正だということに気がつくまでずいぶんかかりました。試行錯誤で回転はできたものの、Apple の解説に書いてあることと一致しないので、どこを間違えたのだろうかと悩みました。(もちろん、今でも私が間違っている可能性があります)

    ところで、映像の回転については、はじめは iPhone の splice というアプリを試しました。

    しかし、この動画についてはうまく読み込めないようです。いろいろ検索語をかえながら探していたら、PC の QuickTime Pro なら回転の編集が一瞬で終わるとのこと。一瞬ということなら、ヘッダを書き換えるだけでよいはず。それでみつけて参考にしたのが、

    Apple のデベロッパーセンターからダウンロードできる dumpster というツールを使うのですが、運が悪いことに、

    の直後であちこちダウンしたまま、登録できず、なにもダウンロードできずという状態でした。ほかのサイトからダウンロードできるのは dumpster の Win32 ビット版のみで、そのサイトによると、もともと 64 ビット版はないらしい。QuickTime atom をいじるほかのツールも Apple デベロッパー センターがダウンしていてダウンロードできず。

    で概要を読むと、自分でプログラムを作って利用できなくはないようでした。さらに検索していたら

    などがでてきて、バイナリエディタだけでもちょっとした書き換えならどうにかなりそう。ということでやってみました。

    正規の QuickTime のライブラリをきちんと使っているソフトなら変換行列を使うのでしょうが、向きを決め打ちで表示しているソフトでは90°傾いたままなのでしょうね。それ以前に、ひょっとして、この書き換えで不整合を生じて、読み込みさえ不能の可能性もあり? いやいや、この程度の書き換えなら大丈夫ですよね。仕様書や解説は matrix のところを拾い読みしただけなので、一抹の不安が残っています。

    (2013/7/31)

    (2013/8/8) サムネイル画像追加

    (2025/2/8) 数式描画を MathJax に変更

  • mathTeX.cgi のキャッシュ

    LaTeX 数式の表示は、サーバに latex と dvipng の実行ファイル( TeX Live 2010 )を入れ、mathTeX の CGI から呼び出しています。(一部は mimeTeX)

    昨日気がついたのですが、このサイトのところどころで mathTeX のエラー(7) が発生しています。

    エラーメッセージ ☞ (7) Can't run latex program... mathtex.cgi

    (7) Can’t run latex program:
    check -DLATEX=\”path\”, etc.
    See mathtex.html#message7

    対処療法的には、ページ記述の際に数式に mathtex.cgi の \cache オプションを付加して明示的にサーバにキャッシュを生成するようにすれば、何度かページを再読み込みする間に解消するようです。明示しなくてもデフォルトでサーバにキャッシュ画像を生成するはずなのですが、うまくいかないことがあるようです。latex や dvipng で処理した画像のキャッシュファイルが一度生成できれば、次からはキャッシュ画像を返すようになります。

    サイトをご覧の方の側では、ブラウザで何度か再読み込みを繰り返すと、そのうちに数式画像が表示されるようになります。(たいていは…… orz )

    このエラーは複数の LaTeX 数式画像があるページで発生していて、ブラウザで再読み込みするたびに違う数式画像がエラーになります。サーバ上の mathtex.cgi 用キャッシュ ディレクトリを眺めていると、エラーになるような場合、数式画像のキャッシュが残っていません。

    エラーメッセージによると latex プログラムが実行できないと言っているので、処理が間に合わずに多重起動で失敗が連鎖していくような状況でしょうか。何がおこっているのかはよくわかりません。場合によっては、dvipng が実行できないエラーのこともあります。以前のサーバでは発生していなかったようにも思えるので、CGI や実行ファイルの起動数など、サーバ側の設定による可能性もあります。

    だいたい、LaTeX の処理系自体、シェルログインできないサーバにFTP でファイル一式コピーして、無理やり動かしています。そんな状態なので、現象や問題の切り分けからして難しいんですよね。

    mathtex.cgi は 1.05 が出ていたので 1.03 からバージョンアップしましたが、同じ現象が起こっているようです。

    mathTeX version 1.03 → mathTeX version 1.05

    mathtex.cgi に \version を渡すと、

    現在:(略)

    なお、一度キャッシュが生成されると自動的には書き換わらないので、バージョンアップしたらキャッシュをクリアしておかないと、いつまでも古いバージョンとして表示され続けます。

    < img src=”…/mathtex.cgi?… ” / > で直接書くより、 [ tex ] ~ [ /tex ] で呼び出すほうがエラーの率が高いように思えますが、はっきりしません。問題は mathtex.cgi ではなく、[ tex ] のほうのプラグインかもしれません。

    以下、適当に数式を載せてみます。

    TeX入門/簡単な数式(2) – TeX Wiki より

    mathTeX manual (mathtex.html) より

           

    エラー(7)にならずに表示されているでしょうか。このページ作成時には表示可能でしたが……。私のサイトには LaTeX 処理系のサブセットしか入れていないので、表示不能の例もいろいろありました。そういう場合もエラー(7)が表示されるようです。

    (2013/7/13)

    (2025/2/8) MathJax 化にともない、一部画像を削除。

  • ネジバナ

    ネジバナ

    今年もベランダにネジバナが咲いています。だんだん上のほうに花が移ってきました。

    (2013/6/30)

    ねじれにも生物学的な意味があるようです
    雨に負けぬ花〜Flowers Never Bend With the Rainfall : COMPLEX CAT

    (2013/6/30)

  • 神明神社と天王山塚古墳 (2)

    神明神社と天王山塚古墳 からのつづき)

    • 塩野 博、「― 埼玉県南埼玉郡菖蒲町下栢間所在 ― 天王山塚古墳について」、1977、埼玉考古第16号

    に、栢間古墳群の各古墳の場所がわかる地図(「第1図 天王山塚古墳の位置と周辺の古墳」。同 p.2)が載っていました。

    グーグルの航空写真と「第1図」と見比べつつ、栢間古墳群と神明神社に KML でピンを立ててみました。
    [map style=”width: auto; height:300px; margin:20px 0px 20px 0px; border: 1px solid black;” maptype=”SATELLITE” z=”15″ kml=”https://www.makisima.org/wp/v3c/20130615_kayama-kofungun_1977.kml”]

    第1図 天王山塚古墳の位置と周辺の古墳 (塩野博、「天王山塚古墳について」、1977、p.2、埼玉考古第16号)
    「第1図 天王山塚古墳の位置と周辺の古墳」(塩野博、「天王山塚古墳について」、1977、p.2、埼玉考古第16号)
    1) 天王山塚古墳、2) 夫婦塚古墳、3) 円墳、4) 禿塚古墳、5) 押出塚古墳、6) 富士塚古墳、7) 大日塚古墳

    天王山塚古墳は、県道川越栗橋線を下栢間字本郷で、行田笠原蓮田線を約500m北西(鴻巣市笠原方面)に入ったところ、南埼玉郡菖蒲町大字下栢間3288ほかに所在する前方後円墳である。

    この古墳は、元荒川左岸の北足立台地の笠原支台(標高14m)に立地し、「栢間七塚」と称され、現在7基で構成されている栢間古墳群の主墳である。 (同 p.1)

    昭和52年(1977)の文献なので、地図には新幹線の線路がありません。現地の案内板では9基と書いてあったので、その後、いくつか古墳が確認されたようです。

    墳丘は、西側(前方部裾)を町道に限られているが、東側及び南側に原形をみることができる。北側は町道及び墓地などによってかなり変形している。また後円部には、文政7年、領主内藤外記の家臣萩原鹿右衛久安が主命を以て浅間社信仰のため、中央よりやや北東寄りに直径約20m、高さ6mの土を盛って、天保2年、富士山浅間社を勧請した小山跡があるため、大きく変形している。

    また、後円部上には、前方部へ移行するくびれ部の近くに、間口3間、奥行3間3尺の薬師堂が建立されている。したがって、これらに参拝するための石段が墳丘南側と北側に設けられている。(同 p.3)

    前方部上にも須賀神社が鎮座していたが、それほど変形していない。(同 pp.3-5)

    この天王山塚古墳が、明治9年に作成された「地引番号全図第18区武蔵国埼玉郡上栢間村」の天王山塚古墳の部分(原本は菖蒲町で所有)をみても(第2図)、墳丘が現況と変化しておらず、完全な形で保たれてきたのは、この古墳が、私有地ではなく、神明神社及び正法院の一社一寺の連帯管理によるものであったためであろう。(同p.5)

    神明神社と関係があったわけですね。神明神社の社叢 550m の参道が保たれてきたのも古墳があればこそなのかもしれません。正法院は天王山塚古墳を挟んで反対のほうです。

    天王山塚古墳は、前方部を元荒川の西向き(正確には北66.5度西)にむける。すなわち、前方部は、西より23.5度北に偏している。前述したように、昭和38年3月に墳丘の測量を行なったので、その実測図に基づいて天王山塚古墳の墳丘規模を算定してみる。

    23.5度というと、地球が傾いている角度23.4度を思い出しますが、だからといって夏至の日にまっすぐに日がさすとか言う訳でもありませんね。

    その等高線の図、「第3図 天王山塚古墳実測図(菖蒲町教育委員会原図)」(同 p.4)は略。似た図は「日本古墳大辞典」(東京堂出版)にもあります。

    全長は107mにおよぶ大形のもので、埼玉古墳群の鉄砲山古墳(108m)につぐ前方後円墳である。後円部は、基底部の径55m、頂部は前述したように変形しているが、高さ12m、薬師堂前で5mである。前方部は、前端の幅62m、高さ8mである。したがって、後円部も当初8m以上あり、前方部高と後円部高とがほぼ等しい数値を示していたものと思われる(註10)。くびれ部は、比較的よく原形を留めており、基底部で幅26m、頂上で幅8mを測る。

    なお、天王山塚古墳の平面形では、前方部と後円部の長さがほぼ同じであるが、前方部が拡がっているのが特徴である。

    周堀は、後円部北側にその一部が残存している。現状では幅約8mであるが、建造当初は、この倍はあったものと考えられる。他の周堀部分は、畑や道路となり埋め立てられている。

    内部主体の構造及び出土遺跡については、遺憾ながら何んの伝承もない。おそらく、…… (同 p.5)

    上記、第1図の番号順に7基の古墳の簡単な紹介がされています。

    1 天王山塚古墳

    (上述の通り)

    2 夫婦塚古墳(大字上栢間字古宮3804-3807) 屋敷内に所在する前方後円墳(第4図で、後円部は約3分の1ほど破壊されており、また南から前方部の裾及び東側には溝が掘られており、かなり変形している。

    現長42m。後円部基底部の径23m、高さ2m。前方部は現前端の幅21m、高さ1mであることが判明した。なお、内部主体及び出土遺物は不明である。(同 p.6)

    「第4図 夫婦塚古墳実測図(菖蒲町教育委員会原図)」(同 p.6)は略。

    3 円墳(大字上栢間字古宮3843)

    現径6m、高さ1mの円墳で、かつて須恵器及び埴輪が出土している。

    4 禿塚古墳(大字上栢間字古宮3842)

    行田笠原蓮田線及び町道によって大きく削られて、原形を保っていないが、円墳と考えられる。現径9.60m、高さ1.20m である。内部主体及び出土遺物は不詳である。

    5 押出塚古墳(大字下栢間字本村3249)

    天王塚古墳の南東約100mに所在する円墳で、現径10mである。内部主体及び出土遺物は不詳である。

    6 富士塚古墳(大字下栢間字陣屋2886)

    現径10mの円墳である。内部主体及び出土遺物は不詳である。

    7 大日塚古墳(大字下栢間字大御228)

    天王山塚古墳から1つだけ離れて所在する一辺20m、高さ3mの方形墳である。内部主体及び出土遺物については伝承もなく、これが、古墳であるかどうかは疑問の残るところである。(同 p.6)

    その他、栢間古墳群から発見された埴輪の写真・解説、天王山塚古墳の建造の背景(埼玉古墳群との関係やその時期、周辺の古墳。この古墳は6世紀中頃の建造か)なども考察されています。

    なお、埼玉考古学会の「埼玉考古」は所蔵している図書館がとても少ないようです。第16号については、

    で探すと、埼玉県立浦和図書館に第15号〜18号の合本があります(禁帯出)。さいたま市立中央図書館は第16号が貸出可能。久喜市立菖蒲図書館では「天王山塚古墳について」の抜刷が貸出可能です。(いずれも2013/6/16現在) 埼玉県内でこんな状況なので、県外ではもっと少ないだろうと思われます。さすがに国立国会図書館にはあります(埼玉考古 (埼玉考古学会): 1977|書誌詳細|国立国会図書館サーチ)。

    埼玉県全域での地図では、

    • 文化庁文化財保護部(著作権所有)、「全国遺跡地図 11 埼玉県」、昭和52年(1977)、財団法人 国土地理協会(発行)

    の「埼玉8 鴻巣」(地図のページ)と、番号・名称等の対照表で p.65 の No.69~73 と p.67 の No.204~213 のあたりが栢間古墳群になります。埼玉古墳群は「埼玉7 熊谷」のほうにあります。全国遺跡地図は縮尺の関係で小さな古墳の場所の特定は困難ですが、県内のどのへんに古墳があるのか概観するのに便利そうです。

    • 宮川 進、「さきたま双書 さいたま古墳めぐり」、1997、さきたま出版会

    には埼玉の古墳が見開きごとに写真付きで紹介されていて、天王山塚古墳は pp.98-99 の「さきたま古墳群周辺四天王の一つ ― 天王山塚古墳(菖蒲町)」です。

    さきたま古墳群くらいは名前を知っていましたが、あちこちにたくさん古墳があるんですね。

    (2013/6/16)

    (2013/6/26) 誤字訂正

  • Windows 8 を従来Windows風の使い勝手にする

    @ITの「運用:Windows 8 UIチューニング術」に、Windows 8 を没入型UI(ストア アプリ)ではなく、従来のデスクトップで使いやすくする設定やカスタマイズの方法がまとまっています。個別記事のまとめですね。

    ほかに、WIndows 8 では、ショートカットキーを覚えておくと便利です。

    • [Windows] + [X] (WIndows管理のためのメニュー)
    • [Windows] + [I] 設定チャーム
    • [Windows] + [E] エクスプローラ
    • [Windows] + [L] 画面ロック
    • [Windows] + 数字 (タスクバーのアイコン順)
    • [Windows] + [PrintScreen] 現在表示している画面をPNG形式の画像として保存する
    • [Alt] + [PrintScreen] アクティブなウィンドウのみをコピー(その後、ペイントなどに貼り付け)

    (2013/6/13)

検索(WordPress内)

カテゴリー一覧

マキシマ文庫

Makisima Library, Vol.3

Twenty Twenty-Five Child

Proudly powered by WordPress