作者:手机用户2602931615 | 来源:互联网 | 2023-09-17 13:41
MVC设计模式下在View页面里面使用ckplayer.js加载视频,在MP4格式视频上传之后我发现某些视频可以边加载边播放但是有一些又不行,找了下原因是因为视频的元数据信息在第一帧的时候就
MVC设计模式下 在View页面里面使用ckplayer.js 加载视频 ,在MP4格式视频上传之后 我发现某些视频可以边加载边播放 但是有一些又不行,找了下原因是因为视频的元数据信息在第一帧的时候就不行;找了下解决方案:是下载一个工具处理视频
下载的页面地址是: http://ffmpeg.zeranoe.com/builds/
点击页面上的Download FFmpeg git-738ebb4 64-bit Static(我是64位的),如果你是32位点击 Download FFmpeg git-738ebb4 32-bit Static
下载下来解压缩后我把文件夹改成了ffmpeg放在D盘下面
运行三个文件:
D:ffmpeg/bin/ffmpeg.exe
D:ffmpeg/bin/ffplay.exe
D:ffmpeg/bin/ffprobe.exe
这就成功安装了
下面举二个简单的例子
首先,搞一个视频文件放在D盘根目录下,主要为了省事,比如我放的是:D:/1.flv
在开始->运行里输入cmd,弹出命令窗口
按下面的命令进行操作
输入d:按回车
输入 cd ffmpeg/bin回车
这样就进入了ffmpeg的目录了,
1:测试视频截图的功能
复制如下命令,在命令行里点击鼠标右键选择粘贴
ffmpeg -i d:/1.flv -y -f image2 -t 0.001 -s 720x576 d:/1.jpg
看看D盘下是不是生成了一个1.jpg的图片,是的话就成功了,不是你就认真检查下吧,看看路径是不是正确
2:测试d:/1.flv转成d:/1.mp4
同样,复制下面的命令,在命令窗口里点击鼠标右键选择粘贴
ffmpeg.exe -i "d:1.flv" -y -metadata title="这是视频标题" -metadata comment="这是视频信息!" -c:v libx264 -preset superfast -x264opts keyint=25 -r 15 -b:v 500k -c:a aac -strict experimental -ar 44100 -ac 2 -b:a 64k -vf "movie=a.png[watermark];scale=1364x768[scale];[scale][watermark] overlay=30:30[out]" -f mp4 "d:2.mp4"
等命令执行完成后看看D盘下是不是有个mp4了,有了就说明成功了。
参数说明:
movie=是水印
-b:v 后的500k是码率
scale=后是分辩率
keyint=25 是关键帧 表示每25帧会有一个关键帧
如果你的视频只是元数据信息不在第一帧,下面介绍另一种mp4把元数据信息转到视频第一帧
首先需要下载一个qt-faststart
下载地址:http://www.ckplayer.com/down/qt-faststart.rar
下载下来解压得到qt-faststart.exe放到d:ffmpeg/bin/下面
运行命令:qt-faststart.exe d:/1.mp4 d:/2.mp4
最后出来的这个2.mp4就是成功的了。可以边下载边播放
整个解决方案经过测试是可行的 于是我在C#里面使用CMD命令来运行
public string Test(string cmdText)
{
Stopwatch w = new Stopwatch();
w.Start();
StringBuilder sb = new StringBuilder();
string str = RunCmdForJobs(cmdText);
string[] lines = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines)
{
string[] temp = line.Split(new string[] { ": " }, StringSplitOptions.RemoveEmptyEntries);
if (temp.Length == 2)
sb.AppendFormat("{0}:{1}
", temp[0], temp[1].Trim(' '));
else if (temp.Length == 1)
sb.AppendFormat("{0}
", temp[0]);
}
//sb.Append(str);
w.Stop();
sb.AppendFormat("用时(毫秒):{0}
", w.ElapsedMilliseconds);
return sb.ToString();
}
///
/// 执行cmd命令
/// 多命令请使用批处理命令连接符:
/// /// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
/// 其他请百度
///
public static string RunCmdForJobs(string cmdText)
{
StringBuilder sb = new StringBuilder();
using (Process p = new Process())
{
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.WorkingDirectory = "D:\\ffmpeg\\bin"; //这个属性是设置CMD命令在哪个路径下执行,这里绑定我的视频元数据信息处理工具的路径。
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
p.StartInfo.CreateNoWindow = false; //不显示程序窗口
p.Start();//启动程序
//向cmd窗口写入命令
p.StandardInput.WriteLine(cmdText + "&exit");
p.StandardInput.AutoFlush = true;
//获取cmd窗口的输出信息
StreamReader reader = p.StandardOutput;//截取输出流
string line = reader.ReadLine();//每次读取一行
sb.Append(line + "\n");
while (!reader.EndOfStream)
{
line = reader.ReadLine();
sb.Append(line + "\n");
}
p.WaitForExit();//等待程序执行完退出进程
p.Close();
}
return sb.ToString();
}