PHPで動画をffmpegで変換するサービスを作っています。(flv->mp3)

execでffmpegを使ってやっているのですが、
ニコニコ動画のエンコードみたいに順番にエンコードとかできませんか?
常駐はなしの場合でお願いします。
参考にできるURLがある場合、それを教えてください。
具体的なやり方を教えてくれても構いません。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2008/06/02 16:50:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:t_shiono No.1

回答回数256ベストアンサー獲得回数22

ポイント42pt

「順番にエンコード」とはどのような意味でしょうか?

作成されているシステムがWebアプリかどうかも定かではありませんが、Webアプリであり、入力ファイルがアップロードされ、アップロードされたものからエンコードしていくということでしょうか?

Webアプリであれば、レスポンスを返さなければいけませんので、単純にPHPからffmpegを起動してしまうと、多重にffmpegが起動させてしまう、あるいは、排他制御をするとレスポンスがしばらく返せなくなるという問題があります。

簡単なのは常駐や、cronなどで定期的にエンコードを処理することですが、これがダメとなると、直接ffmpegを起動するのではなく、ffmpegを制御するアプリケーションを介することが必要となります。

具体的には、

  • PHPスクリプト
    • ffmpeg管理プログラムを起動し、自分自身は終了してレスポンスを返す。
  • ffmpeg管理プログラム
    • エンコードの要求を登録する(方法はご自由に)
    • 起動時にすでにffmpeg管理プログラムが起動していないか確認し、起動していれば終了する
    • エンコードの要求がなくなるまでffmpegを順次起動する

というような役割になります。

管理プログラムの多重起動時の処理は、待機させて自分でエンコード処理をしてもよいですが、プロセスがたまってしまう可能性もあるので、多重起動時は要求だけを登録して、エンコード自体はすでに起動している管理プログラムに任せるのがよいかと思います。

厳密にはいろいろ同期を取るひつようないろいろあると思いますが、方針としてはこんな感じではないかなと思います。

ただ、個人的には可能であるならば、常駐させた方が簡単ではないかなと思います。

レンタルサーバではプロセスの起動時間に制限なんかあったりするので、そういった事情であれば別ですが、その場合は上記方法でもうまく機能しません。

何かの参考になれば。

id:kabiy

正確にはnicomimiのような物を自分で作るというもので、LANで動かそうかと思っています。なのでダウンロードですね。

できればプロセスの確認方法があると便利です。

それを教えてくれると・・・。

(ダウンロードとはPHPでファイルを落として、それを変換するということです)

2008/05/29 17:03:24
id:redwing1 No.2

回答回数541ベストアンサー獲得回数3

id:kabiy

はい。

下の書籍は買おうかと思っています。

上は

execでやろうかと。

できれば、そのライブラリでのサンプルがあるといいのですが・・・

2008/05/29 16:52:31
  • id:t_shiono
    作りたいものの操作手順としては、

    1.エンコード要求フォームから動画を指定
    2.ダウンロードリストページを表示すると、エンコード要求があった順番にリストが表示されている
    2.1.エンコードが終了したものについては、ダウンロード用のリンクが表示される
    2.2.エンコードがまだ終了していないものについては、エンコード中、または、処理待ちの表示がされている。

    という感じでよいでしょうか?

    あとは、「ffmpegの管理プログラム」と呼んだものを作るとしたら、やはりPHPで作るのがご希望でしょうか?
  • id:kabiy
    全てPHPが望みですね。
    Rubyでも可能ですが・・なるべくPHPで。
  • id:kabiy
    追記しますと:

    要求:
    1.エンコード要求
    2.flvなどをダウンロードする(tmpフォルダに)
    3.エンコードの順番に追加する(ファイルで)
    4.管理プログラム起動、すでに動いていたら終了

    管理プログラム:
    1.順番にエンコード
    2.エンコードが終了したらmp3フォルダに移動
    3.ファイル読み込んで、(改行区切りだとfile()で)一番上を消去して再度書き込み
    4.なくなるまでループ、なくなったら終了

    という感じですが・・・プロセスのチェック方法などはありますか?
  • id:kabiy
    追記に追記:
    プロセスのチェックはファイルでできることを知りました。
    先ほど、execで終了するまで待つと書きましたが、初期でなるみたいですね;
    勘違いでした。とりあえず作成してみます。
  • id:t_shiono
    プロセスのチェックはうまくいったようですので、あとは作るだけですね。

    管理プログラムの件ですが、PHPで作成する場合は、実行時間を見積もれないので、max_execution_timeなども設定するのをお忘れなく。
  • id:kabiy
    回答ありがとうございます。
    なぜか苦戦していて、負荷が高くなったり無限ループしてたりします。
    まあ、無限ループはmax_execution_time指定忘れとループなんですが・・・。
    変換する動画もどれくらい時間がかかるのかわからないので、どれくらいの値を設定すればいいのでしょうか?
  • id:t_shiono
    単一プロセスで実行するのであれば、max_execution_timeは0を指定して無制限に指定しないといけないですね。
    リクエストが連続できた場合には、すべて終わるまで、終了しては困りますので。

    もし、単一起動で苦戦しているのであれば、とりあえずは、1プロセス1エンコードとしてしまって、エンコードする権利を排他制御で行なうという方法もあるかもですね。

    どんなプログラムを書いているか分からないので、これ以上コメントできませんが、がんばってくださいね!
  • id:kabiy
    PHPに詳しいのならききたいのですが・・・
    まず、起動してるかの確認は
    file_exist(名前は微妙ですがファイルの存在を確認)であったら動作中、なかったら起動していない
    と考えて管理プログラムを起動させています。
    そして、無限ループになりかけたのが
    管理プログラムの:
    for($i = 0;count($rs) != 0;$i++) {
    $video_id = $rs[0];//エンコード待ちリストの一番最初を変換する動画とする(smほにゃらら)
    exec("say $video_id");//動作中を確認するためMacの音声合成システムに喋らせる
    login_to_video($video_id);//ニコニコから取得するここから
    $video = get_video_position($video_id);
    get_video($video, $video_id);//ここまで
    convert_v("/Library/WebServer/Documents/nicopeg/tmp/$video_id.flv",$video_mode,$video_id);//エンコードする
    $rs = delAndLoadRequest();//最上部を削除してほげほげ(リロードも行う)
    exec("say next");//音声合成システムに喋らせる
    }
    この部分で無限ループしていそうなんですが・・・
    count($rs) != 0
    ここが悪いんでしょうか?(forの)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません