1

你们没看错 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";
}

这是我到目前为止所得到的图像: 样本

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

4

3 回答 3

4

是的,有可能做你想做的事。首先,您需要从 URL 中解析出视频的 ID。例如,拿这个视频(搜索 stackoveflow 时出现的第一个 YouTube 视频,仅供参考)网址:http ://www.youtube.com/watch?v=zsYjsgm4Psg 。其视频 ID 为zsYjsgm4Psg从这篇文章中引用@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

在此处输入图像描述

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

于 2013-07-23T03:25:15.113 回答
1

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

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

通过快速搜索,我发现了这个论坛帖子,其中包含以下代码片段:

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); }

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

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

于 2013-07-23T08:12:34.953 回答
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();

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

最终视图

如果有人访问检查此问题和答案,如果有人有疑问,请在此处发表评论。我很乐意帮助你们......非常感谢 ffmpeg.. :)

于 2013-07-27T11:29:51.720 回答