Asp.net视频播放问题..在线等..急..提意见者有分....

wangping_li 2008-05-27 12:25:14
我有一个视频上传的界面.可以支持任何格式(不能限制上传格式)..当我读出来的时候,是调用系统自带的播放器.问题是系统自带的播放器支持的格式是有限的,有可能我之前上传的格式它就不支持.现在想在调用播放器的时候判断文件类型是否为播放器所支持.如果不支持就解码(网上有没有这方面的解码工具可以直接调用.如果用C#写的话,速度怎么样?).谢谢大虾们赐教.小弟万分感谢...提提意见也行.最好有这方面的例子..谢谢
就像有的电影播放网站.有的格式不支持时,它也要解码的..
...全文
1217 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdss 2012-05-02
  • 打赏
  • 举报
回复
马克之
微wx笑 2011-11-29
  • 打赏
  • 举报
回复
mark 下
lfywy 2010-05-06
  • 打赏
  • 举报
回复
mark 下
lovehooho 2010-04-19
  • 打赏
  • 举报
回复
很有用的贴`
xmin 2009-12-08
  • 打赏
  • 举报
回复
也在做这方面的!!
JohnSoft 2009-08-03
  • 打赏
  • 举报
回复
记号一下
tiancaixgd 2009-05-20
  • 打赏
  • 举报
回复
标记
slove1116 2009-03-19
  • 打赏
  • 举报
回复
记号一下
GengWH 2008-05-28
  • 打赏
  • 举报
回复
现在视频网站基本上都统一使用了.Flv格式文件,使用Flash做为播放器
如果加上FFMpeg、MenCoder、FlvTool2三个工具可以形成一套完整的方案,基本上常见的格式都支持转换。
FlvTool2是为Flv文件加标签的.
wangping_li 2008-05-28
  • 打赏
  • 举报
回复
怎么没人啊..急啊.现在谁给一个直接调用media player的,但是url是我自己指代码指定的.谢谢.其它格式下次再完善.
wangping_li 2008-05-28
  • 打赏
  • 举报
回复
高手们多多提意见啊.急...........
可不可以把播放器不支持的类型全转换为wma的.那样就支持了..网上找了半天没找到这方面的代码,哪位大哥知道忘赐教,万分感谢.
分不够可以加.
wangping_li 2008-05-27
  • 打赏
  • 举报
回复
clal 谢谢.我看一下
clal 2008-05-27
  • 打赏
  • 举报
回复

#region //运行FFMpeg的视频解码,(这里是(虚拟)相对路径)
/// <summary>
/// 转换文件并保存在指定文件夹下面(这里是相对路径)
/// </summary>
/// <param name="fileName">上传视频文件的路径(原文件)</param>
/// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
/// <param name="imgFile">从视频文件中抓取的图片路径</param>
/// <returns>成功:返回图片虚拟地址; 失败:返回空字符串</returns>
public void ChangeFileVir(string fileName, string playFile, string imgFile)
{
//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\aspx1\ffmpeg.exe" />
string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
{
return;
}

//获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg
string flv_img = System.IO.Path.ChangeExtension(Server.MapPath(imgFile), ".jpg");
string flv_file = System.IO.Path.ChangeExtension(Server.MapPath(playFile), ".flv");


//截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />
string FlvImgSize = PublicMethod.sizeOfImg;

System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过
//ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv
FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;

try
{
System.Diagnostics.Process ps = new System.Diagnostics.Process();
ps.StartInfo = FilestartInfo;
ps.Start();
Session.Add("ProcessID", ps.Id);
Session.Add("flv", flv_file);
Session.Add("img", imgFile);
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Test);
myTimer.Enabled = true;
}
catch
{
}
}
#endregion

#region //运行mencoder的视频解码器转换(这里是(绝对路径))
public void MChangeFilePhy(string vFileName, string playFile, string imgFile)
{
string tool = Server.MapPath(PublicMethod.mencodertool);
//string mplaytool = Server.MapPath(PublicMethod.ffmpegtool);

if ((!System.IO.File.Exists(tool)) || (!System.IO.File.Exists(vFileName)))
{
return;
}

string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");


//截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />
string FlvImgSize = PublicMethod.sizeOfImg;

System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(tool);

FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
FilestartInfo.Arguments = " " + vFileName + " -o " + flv_file + " -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1 -vf scale=" + widthOfFile + ":" +heightOfFile + " -ofps 12 -srate 22050";
try
{
System.Diagnostics.Process ps = new System.Diagnostics.Process();
ps.StartInfo = FilestartInfo;
ps.Start();
Session.Add("ProcessID", ps.Id);
Session.Add("flv", flv_file);
Session.Add("img", imgFile);
//pId = ps.Id;
//flvName = flv_file;
//imgName = imgFile;
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Test);
myTimer.Enabled = true;
}
catch
{
}
}


/// <summary>
/// 记时器功能,自动保存截图
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void myTimer_Test(object sender, System.Timers.ElapsedEventArgs e)
{
if (!object.Equals(null, Session["ProcessID"]))
{
try
{
System.Diagnostics.Process prs = System.Diagnostics.Process.GetProcessById(int.Parse(Session["ProcessID"].ToString()));
if (prs.HasExited)
{
CatchImg(Session["flv"].ToString(), Session["img"].ToString());
catchFlvTool(Session["flv"].ToString());
myTimer.Enabled = false;
myTimer.Close();
myTimer.Dispose();
Session.Abandon();
}
}
catch
{
CatchImg(Session["flv"].ToString(), Session["img"].ToString());
catchFlvTool(Session["flv"].ToString());
myTimer.Enabled = false;
myTimer.Close();
myTimer.Dispose();
Session.Abandon();
}
}
}

#endregion


public string catchFlvTool(string fileName)
{
//
string flvtools = Server.MapPath(PublicMethod.flvtool);
//
string flv_xml = fileName.Replace(".flv", ".xml").Replace(PublicMethod.upFile.Replace("/", ""), PublicMethod.xmlFile.Replace("/", ""));
//
System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(flvtools);
ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//
ImgstartInfo.Arguments = " " + fileName + " -UPx " + fileName + " > " + flv_xml;
try
{
System.Diagnostics.Process.Start(ImgstartInfo);
}
catch
{
return "";
}
//
if (System.IO.File.Exists(flv_xml))
{
return flv_xml;
}

return "";
}
}
clal 2008-05-27
  • 打赏
  • 举报
回复
我这里有一个没完成的东东
你可以参考一下
另外,我上传是用HttpModules进行上传管理的,那样可以解决大文件上传的问题,以及在写入前就可以判断文件的安全性.

using System;
using System.Configuration;

public class PublicMethod:System.Web.UI.Page
{
public PublicMethod()
{

}
//文件路径
public static string ffmpegtool = "ffmpeg/ffmpeg.exe";
public static string mencodertool = "mencoder/mencoder.exe";
public static string flvtool = "flvtool/flvtool2.exe"; //flv标记工具

public static string upFile = "UpFiles" + "/"; //上传文件夹
public static string imgFile = "ImgFile" + "/"; //图片文件夹
public static string playFile = "PlayFiles" + "/"; //flv文件夹
public static string xmlFile = "xmlFiles" + "/"; //xml文件夹

public static string sizeOfImg = "240x180"; //图片的宽与高
public static string widthOfFile = "400"; //flv文件的宽度
public static string heightOfFile = "350"; //flv文件的高度

//public static string ffmpegtool = ConfigurationManager.AppSettings["ffmpeg"];
//public static string mencodertool = ConfigurationManager.AppSettings["mencoder"];
//public static string upFile = ConfigurationManager.AppSettings["upfile"] + "/";
//public static string imgFile = ConfigurationManager.AppSettings["imgfile"] + "/";
//public static string playFile = ConfigurationManager.AppSettings["playfile"] + "/";
//文件图片大小
//public static string sizeOfImg = ConfigurationManager.AppSettings["CatchFlvImgSize"];
//文件大小
//public static string widthOfFile = ConfigurationManager.AppSettings["widthSize"];
//public static string heightOfFile = ConfigurationManager.AppSettings["heightSize"];

// // //获取文件的名字
private System.Timers.Timer myTimer = new System.Timers.Timer(3000);//记时器
public static string flvName = "";
public static string imgName = "";
public static string flvXml = "";
public static int pId = 0;


public static string GetFileName(string fileName)
{
int i = fileName.LastIndexOf("\\") + 1;
string Name = fileName.Substring(i);
return Name;
}
//获取文件扩展名
public static string GetExtension(string fileName)
{
int i = fileName.LastIndexOf(".")+1;
string Name = fileName.Substring(i);
return Name;
}
//
#region //运行FFMpeg的视频解码,(这里是绝对路径)
/// <summary>
/// 转换文件并保存在指定文件夹下面(这里是绝对路径)
/// </summary>
/// <param name="fileName">上传视频文件的路径(原文件)</param>
/// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
/// <param name="imgFile">从视频文件中抓取的图片路径</param>
/// <returns>成功:返回图片虚拟地址; 失败:返回空字符串</returns>
public void ChangeFilePhy(string fileName, string playFile, string imgFile)
{
//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\aspx1\ffmpeg.exe" />
string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
{
return;
}

//获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg

string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");


//截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />
string FlvImgSize = PublicMethod.sizeOfImg;

System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
//ImgstartInfo.Arguments = " -i " + fileName + " -y -f image2 -t 0.05 -s " + FlvImgSize + " " + flv_img;

try
{
//转换
System.Diagnostics.Process.Start(FilestartInfo);
//截图
CatchImg(fileName, imgFile);
//System.Diagnostics.Process.Start(ImgstartInfo);
}
catch
{
}
}
#endregion

#region 截图
public string CatchImg(string fileName,string imgFile)
{
//
string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
//
string flv_img =imgFile+".jpg";
//
string FlvImgSize = PublicMethod.sizeOfImg;
//
System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//
ImgstartInfo.Arguments = " -i " + fileName + " -y -f image2 -ss 2 -vframes 1 -s " + FlvImgSize + " " + flv_img;
try
{
System.Diagnostics.Process.Start(ImgstartInfo);
}
catch
{
return "";
}
//
catchFlvTool(fileName);
if (System.IO.File.Exists(flv_img))
{
return flv_img;
}

return "";
}
#endregion
wangping_li 2008-05-27
  • 打赏
  • 举报
回复
TO:iuhxq
嗯,这样很好.上传的时候全部编码成flv格式的文件.现在是改别人的系统,麻烦死了
不知道你有没有这方面的示例代码,如果有的话希望可以让我参考一下.以前没做过这种东西.谢谢!
iuhxq 2008-05-27
  • 打赏
  • 举报
回复
你这个逻辑问题很严重

你不能给每个用户,每个视频反复重复解码.

你应该是转化成一个固定的格式,比如flv,用不支持的话,让他自己去下载播放器.
你一个用户解码一次,那不现实.会重复解码,浪费资源.而且用户看之前再解码,速度跟不上.

综上:必须上传以后编码成某称格式存储.比如FLV,然后用户看的时候直接使用固定的播放器.
wangping_li 2008-05-27
  • 打赏
  • 举报
回复
Clal有没有这方面的例子.我看一下.急啊.
关键是上传时不限制格式,头痛..
clal 2008-05-27
  • 打赏
  • 举报
回复
现在视频网站基本上都统一使用了.Flv格式文件,使用Flash做为播放器
如果加上FFMpeg、MenCoder、FlvTool2三个工具可以形成一套完整的方案,基本上常见的格式都支持转换。
FlvTool2是为Flv文件加标签的.
milozy1983 2008-05-27
  • 打赏
  • 举报
回复
这个最好自己做个自定义控件,然后根据视屏文件的后缀名在控件的Render方法里显示出不同的播放器.
clal 2008-05-27
  • 打赏
  • 举报
回复
大文件上传,现在也有不少不错的控件,像slickupload等
http://www.cnblogs.com/bashan
写了一篇大文件上传总结,带状态和进度条.
里面有详细的原理,逐步实现的方法,1.1和2.0的原码都有
想学习的可以看看
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧