Top/Windows/Google VideoをAVIに変換

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)
差分 一覧