none
wmvファイルからJPEGファイルへ RRS feed

  • 質問

  • VS2005のc#にて、ASP.NETの勉強をしているのですが、一点どうしてもわからず、
    困っております。
    内容としては、wmvの動画ファイルをFileUploadを利用してアップして、
    アップされた動画の最初の映像部分(1フレーム)をjpegファイルに変換して
    表示させたいのですが、(イメージとしては、YouTubeのようなことを考えております。)
    どうかご教授ねがえないでしょうか。
    2009年6月30日 1:12

回答

  • ちょっと調べてみましたが、totojo さんが書かれている FFmpeg を使うのが簡単そうです。一応、以下の
    コードで試してみましたが、wmv から直接 jpeg のサムネイルを作ることが可能でした(以前のバージョン
    では flv からでないとサムネイルは作れなかったそうですが)。

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        if (!FileUpload1.HasFile)
        {
            return;
        }

        HttpPostedFile postedfile = FileUpload1.PostedFile;
        string fullFilename = postedfile.FileName;
        string filename = System.IO.Path.GetFileName(fullFilename);
        string path = Page.Server.MapPath("~/FileUploadTest/");

        if (System.IO.File.Exists(path + filename))
        {
            return;
        }
        else
        {
            postedfile.SaveAs(path + filename);
            string command = Page.Server.MapPath("~/Bin/") + "ffmpeg.exe";
            string option = " -i " + path + filename + " -ss 1 -vframes 1 -f image2 " + path + filename + ".jpg";
            System.Diagnostics.Process.Start(command, option);
        }
    }

    FFmpeg は以下のサイトで入手できます。

    http://ffmpeg.org/

    ただし、上記のサイトから入手できるのはソースですので、自分は以下のサイトから Windows 向けバイナリを
    いただきました。テストでは、ここから入手した ffmpeg.exe と pthreadGC2.dll を使っています。

    i43z Technology News
    http://i43z.com/

    • 回答としてマーク kyulove 2009年7月5日 12:04
    2009年7月4日 7:35
  • パスを通す必要があるとか、wmv ファイルが存在しないとダメとか、基本的なことは理解されてい
    るでしょうか。

    まず、ダウンロードした ffmpeg.exe をコマンドラインから実行してみて、jpeg ファイルが作成され
    ることを確認してください。

    次に、先に私がアップしたコードをそのまま使って試してみてください。その際、ffmpeg.exe と
    pthreadGC2.dll はアプリケーション・ルート直下に Bin フォルダを作ってその中に入れ、さらに
    wmv ファイルと jpeg ファイルの格納用に FileUploadTest フォルダを作ってください。

    • 回答としてマーク kyulove 2009年7月5日 12:04
    2009年7月4日 19:11

すべての返信

  • wmv、サムネイルをキーワードに検索してみてはいかがでしょう? たぶん参考になるサイトが見つかると思います。asp.net とはあまり関係の ない話のような気がします。
    2009年6月30日 3:36
  • 検索エンジンにて、wmv、サムネイルをキーワードに検索して色々と見ましたが、
    出てくるのは、変換するソフトウェアだったり、vs2008を使用したsilverlightや
    DirectShowを利用した場合しか見当たりません。
    私の検索の仕方が良くないのかも知れませんが、ご教授お願いいたします。

    2009年7月2日 1:35
  • 変換するソフトウェアだったり、

    変換するソフトでいいのではないでしょうか。

    次の URL には FFMPEG を使ってサムネイルを作る方法が紹介されています。

     Image for uploaded .wmv file
     http://social.microsoft.com/Forums/en-US/Offtopic/thread/0d77262e-92cf-493d-b54b-1029ac691239

    こういう便利なツールを用いて簡単に済ますのがよろしいのではないでしょうか。
    2009年7月2日 11:10
  • やりたいことは、

    > 動画の最初の映像部分(1フレーム)をjpegファイルに変換して表示させたい

    と理解していましたが、違うのでしょうか? それに間違いなければ、検索して見つけたツールを
    使ってサムネイル(jpeg ファイル)を作れると思いますが・・・

    ひょっとして、 wmv ファイルをアップロードすると、自動的にそれからサムネイルを取得して表示
    し、それをクリックすると wmv ファイルを再生するように当該ファイルへのリンクをはるような
    ASP.NET のコントロールを探しています?

    残念ながら、そのような便利なコントロールは ASP.NET のライブラリにはないです(自分の知る
    限りですが)。

    複数のコントロール、ライブラリ、プラグインなどを利用し、足りないところは自分でコードを書い
    て、必要な機能を一つ一つ Web アプリに作り込んでいくほか手段はないと思います。

    サムネイルを作って、それを Web ページに貼り付けて、アップロードした wmv ファイルへのリ
    ンクをはってはどうですか? サムネイルをクリックすると wmv ファイルがダウンロードされ、
    Windows Media Player が立ち上がって動画が表示されるはずです。

    2009年7月2日 13:06
  • 貴重なご意見ありがとうございます。
    私が、考えていたのはSurferOnWww さんが言われたとおり、ファイルをアップロードした際、
    自動的にサムネイルを取得して、それを動画ファイルへのリンク画像にする目的でした。
    YouTubeのようなサイトを作ってみたかったのです。
    私の説明不足で申し訳ございません。
    現時点では、Javascriptと連携して、アップした画像を再生するまでは実現できているのですが、
    ページの見た目上、ファイル名でリンクを設定するのが、不満足であったため、このような
    ことを考えていました。
    2009年7月3日 0:29
  • ちょっと調べてみましたが、totojo さんが書かれている FFmpeg を使うのが簡単そうです。一応、以下の
    コードで試してみましたが、wmv から直接 jpeg のサムネイルを作ることが可能でした(以前のバージョン
    では flv からでないとサムネイルは作れなかったそうですが)。

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        if (!FileUpload1.HasFile)
        {
            return;
        }

        HttpPostedFile postedfile = FileUpload1.PostedFile;
        string fullFilename = postedfile.FileName;
        string filename = System.IO.Path.GetFileName(fullFilename);
        string path = Page.Server.MapPath("~/FileUploadTest/");

        if (System.IO.File.Exists(path + filename))
        {
            return;
        }
        else
        {
            postedfile.SaveAs(path + filename);
            string command = Page.Server.MapPath("~/Bin/") + "ffmpeg.exe";
            string option = " -i " + path + filename + " -ss 1 -vframes 1 -f image2 " + path + filename + ".jpg";
            System.Diagnostics.Process.Start(command, option);
        }
    }

    FFmpeg は以下のサイトで入手できます。

    http://ffmpeg.org/

    ただし、上記のサイトから入手できるのはソースですので、自分は以下のサイトから Windows 向けバイナリを
    いただきました。テストでは、ここから入手した ffmpeg.exe と pthreadGC2.dll を使っています。

    i43z Technology News
    http://i43z.com/

    • 回答としてマーク kyulove 2009年7月5日 12:04
    2009年7月4日 7:35
  • たびたび貴重なご意見ありがとうございます。
    SurferOnWww 様のご意見を参考にさせていただき、
    下記のようにテストコードを入力しましたが、次のような
    エラーが帰ってきます。
    ffmpeg.exe と pthreadGC2.dll と動画ファイルは、
    念のため、webサイトと同じ場所に置いております。
    ----テストコード-----
            string filename = Server.MapPath(".") + "a.wmv";
           if (System.IO.File.Exists(filename))
            {
                return;
            }
            else
            {
                string command = "ffmpeg.exe";
                string option = " -i " + filename + " -ss 1 -vframes 1 -f image2" + filename + ".jpg";
                System.Diagnostics.Process.Start(command, option);
            }
    ----エラー内容-----
    System.ComponentModel.Win32Exception はユーザー コードによってハンドルされませんでした。
      Message="指定されたファイルが見つかりません。"
      Source="System"
      ErrorCode=-2147467259
      NativeErrorCode=2
      StackTrace:
           場所 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
           場所 System.Diagnostics.Process.Start()
           場所 System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
           場所 System.Diagnostics.Process.Start(String fileName, String arguments)
           場所 Default2.Button1_Click(Object sender, EventArgs e) 場所 d:\sample\Default2.aspx.cs:行 34
           場所 System.Web.UI.WebControls.Button.OnClick(EventArgs e)
           場所 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
           場所 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
           場所 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
           場所 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
           場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    ----------------

    たびたび申し訳ありませんが、今一度アドバイスをお願い
    できないでしょうか

    2009年7月4日 15:46
  • パスを通す必要があるとか、wmv ファイルが存在しないとダメとか、基本的なことは理解されてい
    るでしょうか。

    まず、ダウンロードした ffmpeg.exe をコマンドラインから実行してみて、jpeg ファイルが作成され
    ることを確認してください。

    次に、先に私がアップしたコードをそのまま使って試してみてください。その際、ffmpeg.exe と
    pthreadGC2.dll はアプリケーション・ルート直下に Bin フォルダを作ってその中に入れ、さらに
    wmv ファイルと jpeg ファイルの格納用に FileUploadTest フォルダを作ってください。

    • 回答としてマーク kyulove 2009年7月5日 12:04
    2009年7月4日 19:11
  • 開発者以前の問題として、一般ユーザーとしてコマンドの起動方法がわかってなさそうですよね。

    別のアプローチとして、
    Windows Explorerでファイルのサムネイル(縮小版)を表示する機能が提供されていますが、これは内部的にはCOMインターフェースとして開発者向けに提供されています。
    そこでWMVのサムネイルを取得してみたんですが…エラーになりました(ぁ

    Vistaからインターフェースが変わったとか何とか、でもJPEGに対しては取得できました…うーん。

    IDLはあるもののTLBが提供されていないのでC#からアクセスするのも結構やっかいで、サンプルコードは諦めました。
    ということで没案。
    2009年7月4日 22:48
  • 皆様、ありがとうございます。
    非常にお恥ずかしいお話ですが、初歩的なミスをしておりました。
    string command = "ffmpeg.exe";
    の所で、
    string command = Server.MapPath("./")  + "ffmpeg.exe";
    と記入しているつもりでいたのですが、 Server.MapPathが抜けて
    おりました。
    こんなミスは自分はしないと思っていたせいか、気づきませんでした。
    皆様の貴重なご意見、アドバイスありがとうございました。

    2009年7月5日 12:04