FlVをMP3に変換

解決


 2010-04-19 05:33:08  No: 38295  IP: 192.*.*.*

現在Flvファイルから音声を抽出しMP3で保存しようと思っております。
どのような手順で作業すればいいか悩んでおります
定石と言いますか、通常ならこうする〜やこのコンポーネントを使用してみては?などの指導をお願いできないでしょうか・・・

編集 削除
manbon  2010-04-19 10:52:13  No: 38296  IP: 192.*.*.*

すでにフリーソフトでは色々とありますが・・・
http://www.forest.impress.co.jp/article/2008/01/23/ecodecotool.html

ご自分でコーディングされたいのですよね・・・
すみません、そういう情報は聞いたことがないです^^;

編集 削除
 2010-04-19 11:59:04  No: 38297  IP: 192.*.*.*

>>manbon
返信ありがとうございます
>ご自分でコーディングされたいのですよね・・・
そうですね、自分でコーティングしたいのですが・・・
やはりエンコード的な物はDelphiでは難しいのですかね^^;
もう少し調べてみるつもりです><

編集 削除
dspack  2010-04-19 12:29:27  No: 38298  IP: 192.*.*.*

多分 directshowを応用すると言うことになるのではないかと思います。
https://www.petitmonte.com/bbs/answers?question_id=4950

Delphiでは、DSPackがありますので検討して見たらどうでしょうか。

編集 削除
take  2010-04-19 12:45:55  No: 38299  IP: 192.*.*.*

FlvがSWFファイルに近い形式であるのならば
内部構造を理解することでMP3ファイルに変換できます。

以前SWFファイルをMP3に変換するソフトを作ったときは
SWFファイルをTFileStreamで読み込み
ヘッダ部分でどのオブジェクトが埋め込まれているか判定し
必要なバイト数を読み込む
という処理で変換できました。

変換と言うより、ほとんどそのまま埋め込まれるので抽出ですね。
ただ、圧縮されているのでZLIBか何かで展開してから
解析を行いました。

編集 削除
 2010-04-19 13:14:56  No: 38300  IP: 192.*.*.*

>>takeさん
返信ありがとうございます

現在調べた所、午後のこ〜だのDLLである「gogo.dll」を使えばうまくいけそうな気がしました
問題はdllの使いかたがいまいち理解していない所です^^;
もう少し調べて厳しそうならDSPackと言う物を調べてみようと思います

編集 削除
ささ  2010-04-19 20:12:40  No: 38301  IP: 192.*.*.*

全部自分でやる必要がないなら、FFMPEGのフロントエンドだけ作っちゃえば楽だけど

編集 削除
 2010-04-19 21:21:56  No: 38302  IP: 192.*.*.*

>>さささん
返信ありがとうございます

FFMPEGを使ってやってみた所

procedure TMainF.Button1Click(Sender: TObject);
const strExeName  = 'ffmpeg.EXE';
begin
   shellExecute(Handle,
                'open',
                PChar(strExeName),
                pchar('-i "c:\a.flv" -ab 128 out.mp3'),
                nil,
                SW_SHOWDEFAULT
               );

end;

上記のコードでa.flvファイルからmp3のファイルが作成できました
後は実行時にDOS窓がでてきるので引数で隠せるのか等の細かい修正を加えたら目的の物ができそうです。
ではちょっと調べてきます

編集 削除
 2010-04-19 21:34:11  No: 38303  IP: 192.*.*.*

解決にするのを忘れておりました

編集 削除
Mr.XRAY  2010-04-20 12:27:23  No: 38304  IP: 192.*.*.*

こんには,Mr.XRAYです.

>後は実行時にDOS窓がでてきるので引数で隠せるのか等

手前味噌ですが,これを非表示にするコードがあります.
Fusaさんの作成したユニットをDelphi2009以降にも対応コードに修正したものです.
こういうのを持っていると何かと便利です.(^^;
ただし,ShellExecuteではなく,CreateProcessです.
また,大変申し訳ありませんが,動作確認はDelphi5〜2010です.

■  03_使用したリダイレクトのユニット
http://mrxray.on.coocan.jp/Delphi/plSamples/552_PipeRedirect.htm#03

今回の事例では,例えば以下のようになるでしょうか.

//  usesにCommandLineUnitを追加
procedure TForm1.Button1Click(Sender: TObject);
var
  ACmdLine : TCommandLineUnit;
  ACmdStr  : String;
begin
  ACmdStr := 'ffmpeg.exe -i "c:\a.flv" -ab 128 out.mp3';
  ACmdLine := TCommandLineUnit.Create;

  try
    ACmdLine.GrabStdOutText(ACmdStr);
  finally
    FreeAndNil(ACmdLine);
  end;
   ShowMessage('END!!');
end;

編集 削除
Mr.XRAY  2010-04-20 12:30:14  No: 38305  IP: 192.*.*.*

>また,大変申し訳ありませんが,動作確認はDelphi5〜2010です.

失礼.Delphi6以降です.

編集 削除