「ほっ」と。キャンペーン

<   2008年 05月 ( 2 )   > この月の画像一覧

実はいまだに動画のファイル形式のことがよくわからない。
わからないなーって避けて通っちゃったら、
ここまで来ちゃったのよね。
H.264 てのは高画質らしいとか、
良く目にするものには、何となくな印象はあるんだけど。
なので、wikipedia を見ながら、自分なりにまとめてみる。
自分が良く目にするあたりのみ。
(だから ogg とか入ってない)

ファイル形式


えーっとまず「コンテナ」があるのね。
このコンテナの中に、映像や音声や字幕や、そのたもろもろ情報を入れられる。
どんな情報が入れられるかは、コンテナ依存。
動画や音声にもそれぞれフォーマットがあって、
コンテナによって、入れられるフォーマットが決まっている。

コンテナとコーデックの種類は、
Wikipedia のまとめがキレイ。さすが。
Template:圧縮フォーマット(Wikipedia)

だから、2つの違う形式のコンテナがあって、
コーデックが同じ映像と音声が入っていたりすると、
劣化させずに変換できたりするのね。
なるほど、そういうことだったのか。

主な音声ファイルフォーマット



  • AAC : MPEG-2, MPEG-4 で使われる。
       RAW AAC のファイル拡張子は .aac。
  • Apple Lossless : Apple 製。
       可逆圧縮なので劣化なし。
       QuickTimeのMOVファイル(.mov)、MP4ファイル(.m4a)のコンテナに入れられる。
  • HE-AAC : MPEG-4 の圧縮方式
  • MP3 : MPEG-1 Layer 3 の略。
       MPEG-1 の音声圧縮方式で、MPEG-2, 4 では AAC が使われている。
  • MPEG-4 : 音声のみの拡張子は m4a
  • RealAudio : いくつかのコーデックを使うらしい
       RealMedia、Matroska などのコンテナに入れられる
  • WMA : Windows Media Audio の略
       Microsoft 製。バージョンはあるけど互換性もある。


主な動画ファイルフォーマット



  • DivX : DivX, Inc. 製。
       MPEG-4 Part 2 をベースにしたらしい。
       AVI、ASF、MKV、OGM、MOV、MP4 などのコンテナに格納することができる。
  • H.264 : MPEG-4/AVC と同一。
       MP4, MPEG-2 システム (MPEG-2 TS), QuickTime のコンテナに入れられる。
  • MPEG-1 : 通常 MPEG というとこれ。
       拡張子が mpg なのに再生できないのは MPEG-2 かも。
  • MPEG-2
  • MPEG-4 : 動画のみの拡張子は m4v。
  • MPEG-4/AVC (H.264) : AVC は Advanced Video Coding の略。
       H.264 と同一。
  • RealVideo
  • WMV : Windows Media Video の略。
       Microsoft 製。MPEG-4 を元にした独自コーデック。
       ASF、AVI などのコンテナに入れる。
  • Xvid : オープンソースでフリー。MPEG-4 ASP 準拠。昔は XviD 。
       AVI、MKV などに入れる。


主なコンテナ


音声のみのコンテナ

  • AU : SUN 製。UNIX 標準。
  • AIFF : Apple 製。非圧縮。
  • WAV : MS + IBM 製。
       通常は非圧縮。MP3、WMA も入れられる。

汎用のコンテナ

  • AVI : Windows 標準。
       映像 : MPEG-[124](DivXなど), WMV, H.264, FLV[14], ...
       音声 : PCM, MP3, AAC, WMA ...
       良く使われるのは mp3+DivX, mp3+VP3, mp3+MS-MPEG4, Vorbis+XviD など。
  • ASF : AVI の後継。ストリーミングに適している。
    映像 : MPEG-4, WMV[7-9], DivX ...
    音声 : WMA9, PCM, MP3 ...
  • MPEG-2システム :
       MPEG-2プログラムストリーム(MPEG-2 PS)とMPEG-2トランスポートストリーム(MPEG-2 TS)の2種類ある。
       PS の方は DVD など、TS の方はデジタル放送なんかで使うらしい。
       H.264 も入れられる。
  • Flash Video : 拡張子 flv 。
       映像 : FLV1, FLV4, H.264 ...
       音声 : MP3, PCM, AAC ...
  • MP4 : 拡張子 mp4。
       映像 : MPEG-[124]、MPEG-4 AVC、DivX
       音声 : AAC、HE-AAC、MP3、MP2、MP1 ...
  • QuickTime : Apple 謹製。拡張子 mov 。
       映像 : MPEG-4、H.264 ...
       音声 : MP3, AAC, Apple Lossless ...
  • RealMedia : 拡張子 rm 。
  • Matroska : マトリョーシカ、と読む。オープンソース。
       映像 : QuickTime MPEG-1/-2/-4, H.264, WMV, FLV, RealVideo ...
       音声 : AAC, MP3, MP2, WMA, RealAudio ...


雑談


しかしアルファベット 3 文字が多いなぁ。
苦手なんだけど、こういう無意味つづりって。
いまだに CSV (Comma Separated Values) と
CVS (Concurrent Versions System) を間違うくらいなのに。
意味わかってても混乱するからね。
絶対覚えらんない。
特に MPEG 周辺は複数の意味を持っている単語が多くて、
全然覚えられない。
仕事で使うわけじゃないから良いんだけど…。
ま、とりあえず「色々ある」ってことだけはわかった<全然ダメ
[PR]
by xiaoxia | 2008-05-30 19:32 | コンピュータ関係 | Comments(3)
最近、C# とか javascript とかで、ASP.NET をやっている。
当然、ヴィジュアル・スタディオ(笑)を使っている。
初めてやったから、まずプロジェクトってファイルを作るところまでに数日(^^;;
C# も初めてなので、HTML 側と C# 側のつながりを理解するのに、さらに数日。
気分はスクリプトな web アプリなのに、
「ビルド」とかって正直なじめないしー(((^^;;
まぁ C# 使うんだから仕方ないわな。

で、つまづいたことと、解決した方法。
もっと良い方法があったら、ご教示くださいませ。

C# と javascript で値を受け渡す方法



☆C# から javascript
//C# で設定
msg.Text = "poipoi";
---------------------------
<!-- HTML の内容 -->
<asp:HiddenField ID="msg" runat="server" />
---------------------------
/* javascript で読み出し */
var msg = document.all["msg"].value;


☆javascript から C#
//先に javascript で設定して postback してから C# で読み出し
if(IsPostBack == true) {
// postback 時に読み出し
string msgstr = msg.Text;
}
--------------------------------------------------
<!-- HTML の内容-->
<form id="foo" runat="server">
<asp:HiddenField ID="msg" runat="server" />
</form>
--------------------------------------------------
/* javascript で設定してsubmit */
foo.msg.innerHTML = "文字列";
foo.submit();

この場合、javascript はクライアント側で動くので、
そのあとにサーバ側の C# に戻さなくちゃならない。
流れとしては、C#(スルー)->javascript(設定)->C#(読み出し)になる。

hidden に設定してしまうと、ソース表示で値が見えてしまう。
見えてしまうのがイヤな場合は、Cookie に設定するしかないのかな。
Session じゃ、JavaScript では操作できないからな。

C# とjavascript の encode/decode


C# と javascript で、URL エンコード/デコードする関数と
UTF-8 の文字列を入力にしたときの結果はこんな感じ。

C#:
HttpUtility.UrlEncode(str) -> %aa%bb%cc
逆は HttpUtility.UrlDecode

javascript:
escape(str) -> %u1111%u2222
逆は unescape

C# の方は UTF-8 の文字を 1 バイトずつエンコードするが、
javascript の方は、UTF-16(UCS-2?UCS-4?) を 1 文字ずつエンコードする。
デコード関数は、エンコードした文字列をデコードするので、
エンコード関数の結果が違うと、デコードできないわけで、
このままだと C# と javascript では相互にエンコード/デコードできない。
たとえば、C# で cookie を設定して、
javascript でデコードするような時は、
UTF-16 なバイト列を 2 バイトずつエンコードして
cookie に設定しなくてはならない。
ちなみに、エンディアンも関係あるので、
そこも考慮しなくちゃならないっぽい。
javascript 側でやってもいいんだけど、
多分、C# の方がクラスが充実していて楽だと思う。

試行錯誤の結果がこれ。
すごくカコワルイ。
C# じゃないじゃん、これ(笑)
もっとスマートなやり方があると思うので、
ぜひ教えてください。
// C# でエンコード
string v = "cookieに格納したいマルチバイト文字列";
byte[] b_arr = Encoding.Unicode.GetBytes(v);
string result ="";
// 2バイトずつ読み込んで %u**** というセットを作る
// 前後を逆にしているのはサーバが Intel 機だから
for (int i=0; i<b_arr.Length; i=i+2) {
   result += String.Format("%u{0,0:X2}{1,0:X2}",
               (int)b_arr[i+1], (int)b_arr[i]);
}
HttpCookie mycky = new HttpCookie("mykey", res);
HttpContext.Current.Response.AppendCookie(mycky);
--------------------------------------------------------
/* JavaScript でデコード */
unescape(document.cookie);

C# の文字列は、文字列として出力させてみると UTF-8 なんだけど、
Windows の内部的には UCS-2(UCS-4?) で持っているので、
文字コード変換しなくて良いらしいよ。
ファイル出力も stream の文字コードを設定すると、自動変換するらしい。
なるほど java ぽいわ、って感じ。

追記(2008/08/16):
javascript に encodeURIComponent / decodeURIComponent という
関数があるのを、コメントで教えていただいた。
実行してみた結果はこんな感じ。
/* 全半角混じりの文字列をエンコードしてみる */
escape("Aあ亜&(+_-)")
  -> %u3042%u4E9C%26%28+_-%29
encodeURIComponent("Aあ亜&(+_-)")
  -> %E3%81%82%E4%BA%9C%26(%2B_-)

/* 上記のエンコード結果をデコードしてみる(できて当然だけど) */
decodeURIComponent("%E3%81%82%E4%BA%9C%26(%2B_-)")
  -> あ亜&(+_-)

encodeURIComponent を使うと、漢字も+も1バイトずつエンコードさるし、
デコードもできるっぽい。
なので、上記の自作関数を使って %u**** を作らなくても、
  C# : HttpUtility.UrlEncode -> javascript : decodeURIComponent
という組み合わせなら、無事に動きそう。
まだ試してないけど。
でも、半角ハイフンやアンスコやカッコをエンコードしたい時はどうするのだろう。
RFC 的にしなくていいから、しなくていいの?
[PR]
by xiaoxia | 2008-05-19 22:17 | プログラム言語 | Comments(3)

ダメ女プログラマ&主婦&腐女子&バイオリン弾き


by 小霞