目的
プレイリストの各項目の間にブランク映像を入れる.
今日からCMをフレーム単位で編集することにしました.
それでテープに書き出す際にCMとCMの間にブランク映像が入れたかったんです.
その理由としては,ブランクを入れとけば,あとでキャプチャーしてからの切りだしを
自動的に行なうことができると思われます.
ブランク入れないと,せっかくカット編集した労力が報われないじゃん.
プレイリストファイル (*.pls)の解析
とある サンプルをダンプしてみたものです.
00000000 00 01 00 00 7e 00 00 00 80 bb 00 00 16 44 3a 5c |....~....サ...D:\|
00000010 30 34 32 38 5c 63 61 70 74 75 72 65 35 30 37 2e |0428\capture507.|
00000020 61 76 69 11 00 00 00 9a 03 00 00 16 44 3a 5c 30 |avi.........D:\0|
00000030 34 32 38 5c 63 61 70 74 75 72 65 35 31 30 2e 61 |428\capture510.a|
00000040 76 69 11 00 00 00 d1 01 00 00 16 44 3a 5c 30 34 |vi....ム....D:\04|
00000050 32 38 5c 63 61 70 74 75 72 65 35 31 30 2e 61 76 |28\capture510.av|
00000060 69 d3 01 00 00 52 05 00 00 16 44 3a 5c 30 34 32 |iモ...R....D:\042|
00000070 38 5c 63 61 70 74 75 72 65 35 31 31 2e 61 76 69 |8\capture511.avi|
00000080 19 00 00 00 d7 01 00 00 16 44 3a 5c 30 34 32 38 |....ラ....D:\0428|
00000090 5c 63 61 70 74 75 72 65 35 31 31 2e 61 76 69 d9 |\capture511.aviル|
000000a0 01 00 00 99 03 00 00 16 44 3a 5c 30 34 32 38 5c |........D:\0428\|
000000b0 63 61 70 74 75 72 65 35 31 32 2e 61 76 69 0c 00 |capture512.avi..|
.
.
00000f30 44 3a 5c 30 34 32 38 5c 63 61 70 74 75 72 65 36 |D:\0428\capture6|
00000f40 32 31 2e 61 76 69 c6 01 00 00 87 03 00 00 |21.aviニ.......|
00000f4e
0x00-0x0b がヘッダ.
0x04 0x7e(16進数) ->126(10進数) 項目数
ちなみに256個を超えるとこんな感じ
00000000 00 01 00 00 16 01 00 00 80 bb 00 00 0c 44 3a 5c |.........皿..D:\|
その他の内容はよく分からないけど,まぁ気にしない
0x0c-0x2a が一つの項目です.
中身を推測してみますと以下になりました.
0x0c +0x00 0x16(16進数)->22 ファイル名の長さ
+0x01 .. +0x16 D:\0428\capture507.avi ファイル名
+0x17 .. +0x1a 0x11 0x00 0x00 0x00 ->0x11 (16進数)->17 (10進数)->00:00:00:17 IN点
+0x1b .. +0x1e 0x9a 0x03 0x00 0x00 ->0x39a(16進数)->922(10進数)->00:00:30:22 OUT点
ドロップフレームの扱いとかどうなってるんでしょうか.
ちょっと気になりますが,今回の目的とは関係ないのでまぁいいや.
プログラム
#!/usr/bin/perl5
#
# Insert data Raptor Video Play List File
#
# eggman@ptie.org 2001.5.13
$BLANK = pack("H2", "0c") . "D:\\blank.avi". pack("H16", "0000000004000000");
read(STDIN, $buf, 4);
printf("%s", $buf);
read(STDIN, $buf, 1);
read(STDIN, $buf2, 1);
$tmp = unpack("C",$buf2)*256 + unpack("C",$buf) ;
$tmp = $tmp*2+1;
read(STDIN, $buf, 1);
read(STDIN, $buf2, 1);
$buf = $tmp%256;
$buf2 = $tmp/256;
printf("%s", pack("C",$buf ));
printf("%s", pack("C",$buf2 ));
read(STDIN, $buf, 7);
printf("%s", $buf);
printf("%s",$BLANK);
while(read(STDIN, $namelength, 1)){
read(STDIN, $buf, unpack("C",$namelength)+8);
printf("%s%s",$namelength,$buf);
printf("%s",$BLANK);
}
#こんなヘッポコなプログラムを作るのにも1時間かかるようじゃだめだめですな.
#pack,unpackにはまりました.
#2001/05/29 項目数が127個までじゃたりないので,32767までOKなように変更しとく.
実行例
% insert_pls.pl < hoge.pls > hogege.pls
00000000 00 01 00 00 7e 00 00 00 80 bb 00 00 12 44 3a 5c |....~......D:\|
00000010 62 6c 61 6e 6b 2e 61 76 69 00 00 00 00 05 00 00 |blank.avi.......|
00000020 00 16 44 3a 5c 30 34 32 38 5c 63 61 70 74 75 72 |..D:\0428\captur|
00000030 65 35 30 37 2e 61 76 69 11 00 00 00 9a 03 00 00 |e507.avi........|
00000040 12 44 3a 5c 62 6c 61 6e 6b 2e 61 76 69 00 00 00 |.D:\blank.avi...|
00000050 00 05 00 00 00 16 44 3a 5c 30 34 32 38 5c 63 61 |......D:\0428\ca|
00000060 70 74 75 72 65 35 31 30 2e 61 76 69 11 00 00 00 |pture510.avi....|
00000070 d1 01 00 00 12 44 3a 5c 62 6c 61 6e 6b 2e 61 76 |...D:\blank.av|
00000080 69 00 00 00 00 05 00 00 00 16 44 3a 5c 30 34 32 |i.........D:\042|
00000090 38 5c 63 61 70 74 75 72 65 35 31 30 2e 61 76 69 |8\capture510.avi|
.
.
.
今後の展開
プレイリストファイルから自動的にMPEG等へのエンコードする方法の確立しときたいです.
プレイリストファイルからTMPGencのプロジェクトファイルが生成できるようにすればいいです.
最近はあんまり手間がかからなければ,動画をMPEGで保存しとくのもありなんじゃないかと
思うようになりました.
|