Google VideoをAVIに変換 の変更点
Google VideoからダウンロードできるAVIはDivX4コーデックを使用したAVIですが、余分なチャンクがついているため、Windows Media Playerでは再生出来ません。~
そこで、Google VideoのAVIから余分なチャンクを除去するツールを作ってみました。
&ref(googlevid2avi.png,nolink,nothumb); &ref(googlevid2avi002.zip,noicon,googlevid2avi 0.0.2); &color(#999999){(2006/05/29)};
*使用方法
+[[Sleipnir用スクリプト Google Video DL>Sleipnir_Script#googlevideo]]を使って、動画をAVIでダウンロードする。
+&ref(googlevid2avi.png,nolink,nothumb); googlevid2avi のアイコンの上に変換したいファイルをドラッグアンドドロップ。
+変換された新規ファイルをWindows Media Playerで再生。~
(再生にはDivX4コーデック(([[ffdshowのCVS版>http://www.paehl.com/open_source/?FFDSHOW]]など))が必要です。)
*ソースコード(Delphi)
&ref(googlevid2avi.dpr,noicon);
#code(Delphi){{
program googlevid2avi;
uses
Windows, SysUtils, Classes;
{$R *.res}
type
TChunk = Packed Record
ID : array [1..4] of Char;
Size : DWORD;
end;
TRIFFChunk = Packed Record
ID : array [1..4] of Char;
Size : DWORD;
FormType: array [1..4] of Char;
end;
TLISTChunk = Packed Record
ID : array [1..4] of Char;
Size : DWORD;
ListType: array [1..4] of Char;
end;
const
APP_NAME = 'googlevid2avi';
NEW_FILE_SUFFIX = '_new.avi';
var
InputMS : TMemoryStream;
OutputFS: TFileStream;
NewFileName: String;
RiffChunk: TRIFFChunk;
ListChunk: TLISTChunk;
GdatChunk: TChunk;
RiffSize: Integer;
MovSize: Integer;
MovData: PByte;
begin
if ParamCount = 0 then
begin
MessageBox(0, '変換したいファイルをドラッグアンドドロップして下さい', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
if ParamCount > 1 then
begin
MessageBox(0, '複数ファイルの一括変換には対応していません', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
if not FileExists(ParamStr(1)) then
begin
MessageBox(0, '変換元ファイルが存在しません', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
if ExtractFileExt(ParamStr(1)) <> '.avi' then
begin
MessageBox(0, '変換元ファイルの拡張子がaviではありません', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
NewFileName := ChangeFileExt(ParamStr(1), NEW_FILE_SUFFIX);
if FileExists(NewFileName) then
begin
if MessageBox(0, '変換先ファイルが存在します。上書きしますか?', APP_NAME, MB_SETFOREGROUND or MB_ICONQUESTION or MB_YESNO) <> IDYES then
begin
exit;
end;
end;
try
InputMS := TMemoryStream.Create;
try
InputMS.LoadFromFile(ParamStr(1));
except
MessageBox(0, '変換元ファイルを読み込めませんでした', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
if (InputMS.Read(RiffChunk, SizeOf(TRIFFChunk)) <> SizeOf(TRIFFChunk)) or (RiffChunk.ID <> 'RIFF') or (RiffChunk.FormType <> 'AVI ') then
begin
MessageBox(0, 'AVIではないようです', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
if (InputMS.Read(ListChunk, SizeOf(TLISTChunk)) <> SizeOf(TLISTChunk)) or (ListChunk.ID <> 'LIST') or (ListChunk.ListType <> 'goog') then
begin
MessageBox(0, 'Google VideoのAVIではないようです', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
if (InputMS.Read(GdatChunk, SizeOf(TChunk)) <> SizeOf(TChunk)) or (GdatChunk.ID <> 'GDAT') then
begin
MessageBox(0, 'Google VideoのAVIではないようです', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
InputMS.Seek(GdatChunk.Size, soFromCurrent);
try
OutputFS := TFileStream.Create(NewFileName, fmCreate or fmOpenWrite or fmShareExclusive);
OutputFS.Write('RIFF', 4);
RiffSize := RiffChunk.Size - 8 - ListChunk.Size;
OutputFS.Write(RiffSize, 4);
OutputFS.Write('AVI ', 4);
MovSize := RiffChunk.Size - 4 - 8 - ListChunk.Size;
GetMem(MovData, MovSize);
InputMS.Read(MovData^, MovSize);
OutputFS.Write(MovData^, MovSize);
except
MessageBox(0, '変換先ファイルへ書き込めませんでした', APP_NAME, MB_SETFOREGROUND or MB_ICONERROR);
exit;
end;
MessageBox(0, PChar('変換完了'+#10+#13+#10+#13+NewFileName+#10+#13+'として保存しました'), APP_NAME, MB_SETFOREGROUND or MB_ICONINFORMATION);
finally
InputMS.Free;
OutputFS.Free;
FreeMem(MovData);
end;
end.
}}
基本的なことが良く分かってなさ過ぎてダメだー (^^;
*参考
-[[jra's thoughts: Google Video hacking>http://blog.nella.org/archives/2006/01/google_video_ha.html]]
-[[AVI RIFF ファイルのリファレンス>http://msdn.microsoft.com/library/ja/directx9_c/directx/htm/avirifffilereference.asp?frame=true]]
*コメント等ありましたらどうぞ :) [#comment]
#pcomment(,5,reply)