動画ファイルを連結するには?

解決


ラジバンダリ  2008-05-09 02:45:48  No: 30668

DOSコマンドで copy /b a.mpg+b.mpg c.mpg
とバイナリモードでコピーすると
動画の連結(a+b=c.mpg)ができるらしいです。
そこで、以下のようなコンソールアプリでも
同様(c.mpgを作らずにa+b=a.mpg)なことが
できないか検討しています。
メモリーの追加コピー?の作法が
全くもってわかりません。
どなたかご教授お願い致します。

program addmpg;

{$APPTYPE CONSOLE}

uses
  SysUtils,Classes;

var
I_EX_FILE:ansistring;
msa,msb:TMemorystream;
begin
  { TODO -oUser -cConsole Main : ここにコードを記述してください }
    msa:=TMemoryStream.Create;
    msb:=TMemoryStream.Create;
  try
   msa.LoadFromFile('c:\a.mpg');
   msb.LoadFromFile('c:\b.mpg');
   //msa.seek(0,soFromEnd);  //この辺りが??最後に移動?
  //msa.CopyFrom(msb,??);  //追加コピー??

   msa.SaveToFile('c:\a.mpg');  //上書きしたい。
  FInally
    msa.Free;
    msb.Free;
  end;

end.


もにゃ  2008-05-09 03:29:46  No: 30669

TFileStreamですな。
一回の書き込みバッファサイズを小さくすると、省メモリ
大きくすると高速化が期待できます。
ちなみにこれは省メモリ版です。

procedure TForm1.Button1Click(Sender: TObject);
var
  aFS1,aFS2:TFileStream;
  aBuf:Byte;
begin
  aFS1:=TFileStream.Create('a.txt',fmOpenReadWrite);
  aFS2:=TFileStream.Create('b.txt',fmOpenReadWrite);
  aFS1.Position:=aFS1.Size;
  repeat
    aFS2.Read(aBuf,SizeOf(aBuf));
    aFS1.Write(aBuf,SizeOf(aBuf));
  until aFS2.Position = aFS2.Size;
  aFS1.Free;
  aFS2.Free;
end;


ラジバンダリ  2008-05-09 20:47:29  No: 30670

もにゃ様。
ありがとうございました。
無事連結できました。

ここからは余談ですが
MPEGヘッダがa.mpgのままの為か
サイズ的には連結されましたが
メディアプレーヤによっては
a.mpgだけしか再生されませんでした。
シークバーも正しくありませんでした。
そもそもcopy /b でも同じだと
思いますがご参考まで。


ラジバンダリ  2008-05-10 04:37:34  No: 30671

もはや、delphiに関係なくなりましたが、
フリーソフトのmpgtx.exeを使えば
上記のような問題も出ずに結合できました。

mpgtx.exe -j "c:\a.mpg" "c:\b.mpg" -o "c:\c.mpg"

参考になればと思いメモを残しておきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加