如何将视频中的图像显示为播放列表的预览

时间:2013-07-23 02:49:35

标签: c# sql asp.net ffmpeg

你们看到Youtube是对的。在您观看视频的同时,您还可以预览相关视频以及链接。所以我们如何从视频本身获取它..是否可以这样做..我能够从数据库中获取URL并显示它...当点击链接时,它将在jquery播放器中播放..所以在此之前预览,或者您可以说用户可以使用该播放列表。

我用我发现的链接更新了我的代码..但是我仍然无法从视频中获取图像..我的代码有什么问题..如果我错了请纠正我..

以下是我的前端代码:

<form id="form1" runat="server">
    <div id="examples" runat="server" style="height:100%;width:100%">
        <div id="vidhead">Latest Videos</div>

    </div>

    </form>

我将在页面加载后从后端添加所有视频链接,如下所示:

   try
    {
        con.Open();
        com = new SqlCommand("Select videourl, videoname from video order by [vid] desc",con);
        DbDataReader dr = com.ExecuteReader();
        DataTable dt = new DataTable();

        if (dr.HasRows)
        {

            int i = 0;
            dt.Load(dr);
            int rows = dt.Rows.Count;


            for (i = 0; i < rows; i++)
            {
                HtmlGenericControl d = new HtmlGenericControl("div");
                HtmlGenericControl s = new HtmlGenericControl("span");
                string[] link = new string[rows];
                string[] name = new string[rows];                    

                d.Attributes.Add("class", "plst");
                s.Attributes.Add("class", "text");
                link[i] = dt.Rows[i]["videourl"].ToString();
                name[i] = dt.Rows[i]["videoname"].ToString();
                string videothumb = link[i];
                string svthto="**Path to save Image**";
                string imgpath=GetVideoThumbnail(videothumb, svthto, 30);

                sb.Append("<a id=" + "\"a" + i + "\"" + " href=" + "\"" + link[i] + "\"" + " class=" + "\"links\"" + ">" + name[i] + "</a>");
                s.InnerHtml = sb.ToString();
                d.Controls.Add(s);
                examples.Controls.Add(d);
                sb.Clear();


            }
        }


    }
    catch(Exception ex)
    {
        ex.Message.ToString();
    }

public string GetVideoThumbnail(string path, string saveThumbnailTo, int seconds)
{
    string parameters = string.Format("-ss {0} -i {1} -f image2 -vframes 1 -y {2}", seconds, path, saveThumbnailTo);
    string pathToConvertor = "C:\\Program Files\\ffmpeg\\ffmpeg.exe";
    var processInfo = new ProcessStartInfo();
    processInfo.FileName = pathToConvertor;
    processInfo.Arguments = parameters;
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;

    File.Delete(saveThumbnailTo);

    using (var process = new Process())
    {
        process.StartInfo = processInfo;
        process.Start();
        process.WaitForExit();
    }

    if (File.Exists(saveThumbnailTo))
        return saveThumbnailTo;
    else
        return "File not Found";
}

这是我到现在所获得的形象: Sample

请注意:我不专注于您的视频管。我正在质疑我存储在服务器端文件夹中的视频。所以如果有任何jquery技术或任何技术来做到这一点,请告诉我。:)

3 个答案:

答案 0 :(得分:4)

是的,你可以做你想做的事情。首先,您需要从URL中解析出视频的ID。例如,拍摄此视频(搜索stackoveflow,FYI时出现的第一个YouTube视频)网址:http://www.youtube.com/watch?v=zsYjsgm4Psg。视频ID为zsYjsgm4Psg。从this post引用@Asaph,

  

每个YouTube视频都有4个生成的图片。他们是可以预见的   格式如下:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg
    http://img.youtube.com/vi/<insert-youtube-video-id-here>/1.jpg
    http://img.youtube.com/vi/<insert-youtube-video-id-here>/2.jpg
    http://img.youtube.com/vi/<insert-youtube-video-id-here>/3.jpg

来自链接帖子的@Asaph提供了有关视频可用的不同图像的更多信息。现在,只需知道1.jpg是视频的缩略图之一就足够了。使用上面的视频ID,我们可以为缩略图建立一个URL

enter image description here

显然,您需要在客户端显示图像,并且您需要将该图像元素的源设置为您生成的缩略图URL,如上所示。

答案 1 :(得分:1)

我不知道你是否可以使用html5和JavaScript的魔力来解决这个问题,但我传统上知道在服务器端实现视频操作的方法是使用流行的命令行视频转换实用程序调用ffmpeg。

可以在http://www.ffmpeg.org/下载。

通过快速搜索,我发现this forum post包含以下代码段:

string videothumb = uniquefilename + fileExt;
Process p;
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "D:\\web\\upload\\ffmpeg.exe";
info.WindowStyle = ProcessWindowStyle.Hidden;
info.Arguments = " -i " + "D:\\web\\upload\\files\\" + videothumb + " -vframes 25 -f image2 -vcodec mjpeg " + "D:\\web\\upload\\thumbnails\\" + uniquefilename + "%d.jpg";
p = Process.Start(info);
while (!p.HasExited) { Thread.Sleep(10); }

现在这似乎不是我见过的最好的代码,但它应该让你开始。

在链接线程的下方,它们还解决了如何控制生成哪些缩略图的问题。

答案 2 :(得分:0)

首先,我要感谢@rtpHarry,他向我介绍了ffmpeg ..否则我不会知道如何实现这一点..这可能不是唯一的方法..但这是对我来说很好的方式.. :)谢谢@rtpHarry .. + 50 ... :)

经过长时间的搜索,我已经提出了这个解决方案,现在看起来很酷很好,这就是我所期待的...... :)

这是我在后端页面加载事件中所做的。

con.Open();
        com = new SqlCommand("Select * from video order by [vid] desc", con);
        string thumbname = "";
        string newthumb = "";
        string newpath = "";
        reader = com.ExecuteReader();
        if (reader.HasRows)
        {
            dt.Load(reader);
            int rows = dt.Rows.Count;
            int i = 0;

            for (i = 0; i < rows; i++)
            {
                int[] id = new int[rows];
                string[] link=new string[rows];
                string[] nid = new string[rows];

                id[i] = Convert.ToInt32(dt.Rows[i]["vid"].ToString());
                link[i] = dt.Rows[i]["videourl"].ToString();
                nid[i]=id[i].ToString();

                thumbname = Server.MapPath("~//Images//Video_Thumbs//") + nid[i] + ".jpg";
                newthumb = nid[i] + ".jpg";
                string link1 = Server.MapPath("~//Videos//") + link[i];
                string param = String.Format("-ss {0} -i \"" + link1 + "\" -s 150*120  -vframes 1 -f image2 -vcodec mjpeg \"" + thumbname + "\"",20);
                Process p = new Process();
                p.StartInfo.Arguments = param;
                p.StartInfo.FileName = Server.MapPath("~\\ffmpeg\\ffmpeg.exe");
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.UseShellExecute = false;
                p.Start();

                newpath="Images//Video_Thumbs//"+newthumb.ToString();
                com1 = new SqlCommand("update video set vidthumb='" + newpath + "' where vid=" + id[i] + "", con);
                com1.ExecuteNonQuery();
            }
        }
        con.Close();

到目前为止,我还没有为视频设计fileupload部分,所以我在页面加载中编写了这段代码。因此,当页面加载来自表格的视频时,将逐一检索“视频”,并且将捕获20秒时间的帧并将其保存在特定文件夹中以及表格“视频”中。实际上,问题是,它没有在路径之前识别Server.Mappath没有“〜”符号。现在它运作良好,这里是我期待的形象...... :)

Final View

如果有人访问检查这个问题和答案,如果有人有疑问,那么请在这里评论..我很乐意帮助你们......并且非常感谢ffmpeg ..:)