最近在开发mpeg视频编辑工具,深感老外的mpeg做的好强大,跨平台都支持,而且目前多个大型视频软件都在用人家的东西,老外这方面超前太多了,他们做基础,我们做应用,虽然是开源的dll库,哪天说没就没了,不啰嗦了,上代码。主要还是视频截取,截图,转码等初级的应用,砖家别见笑,你还舍不得开源你的代码咧。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
namespace WinMediaPlayer
{
class FfmpegHelp
{
public static string FFmpegPath = @".\ffmpeg.exe";
//public static int currentSecond { get; set; }
// public static string videoLengh { get; set; }
public static string videoUrl { get; internal set; }
//public static object newVideo { get; internal set; }
public static double totalSeconds { get; internal set; }
///
/// 运行mpeg批处理
///
///
internal static void RunMyProcess(string Parameters)
{
//p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
//p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
//p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
//向cmd窗口写入命令
//p.StandardInput.WriteLine(cmd);
//p.StandardInput.AutoFlush = true;
var p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = FFmpegPath;
p.StartInfo.Arguments = Parameters;
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.CreateNoWindow = false; //不显示程序窗口
p.Start();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
}
///
/// 截屏
///
///
///
///
internal static void screenShot(string videoUrlPath, string targetUrl, string currentTime)
{
string processPara = string.Format("-ss {2} -i {0} -t 0.01 -f image2 -y {1}", videoUrlPath, targetUrl, currentTime);
RunMyProcess(processPara);
// ffmpeg - i[视频路径] - r 1 - q:v 2 - f image2 image-% d.jpeg
//-r:每秒提取的帧数,如上面为每秒1帧,即一张图像
//- q:v :图片质量
//- f:图片格式,上述为image2
//image -% d.jpeg:生成图像的文件名,可以加上完整路径,% d会使文件名按整数编号,如上述生成图像为image - 1.jpeg, image - 2.jpeg, ...
//还有其他参数:
//-t:持续时间,如 - t 4表示持续4s
//- ss:起始时间,如 - ss 01:30:14,从01: 30:14开始
//- vframes:指定抽取的帧数,如 - vframes 120,指定抽取120张
//- s:格式大小,如 - s 640x360
//- y:覆盖,直接使用
}
///
/// 手动截取视频
///
///
///
///
///
internal static void cutVideo(string startTime, int videoLen, string targetVodeo,string videoUrl)
{
string processPara = string.Format("-i {0} -ss " + startTime + " -t " + videoLen + " -codec copy {1} ", videoUrl, targetVodeo); //视频切割
RunMyProcess(processPara);
}
///
/// 创建文件夹
///
///
///
internal static string createPath(string targetPath)
{
string targetUrl = System.Environment.CurrentDirectory + @"\";
string targetFolder = targetUrl + DateTime.Now.ToString(targetPath);
if (!File.Exists(targetFolder))
{
Directory.CreateDirectory(targetFolder);
}
return targetFolder;
}
///
/// 自动切割视频
///
///
///
///
internal static void autoCutVideo(int videoLengh, int videoCount, string targetFolder)
{
string processPara = "";
int currentSecond = 0;
for (int i = 0; i < videoCount; i++)
{
string newVideo = targetFolder + @"\newFile" + i + @".mp4";
processPara += string.Format("-i {0} -ss " + currentSecond + " -t " + videoLengh + " -codec copy {1} ", videoUrl, newVideo); //视频切割
currentSecond += videoLengh;
// RunMyProcess(processPara);
}
RunMyProcess(processPara);
}
///
/// 视频转码
///
private void convertCode( string path)
{
Process p = new Process();
p.StartInfo.FileName = path + "ffmpeg.exe";
p.StartInfo.UseShellExecute = false;
string srcFileName = "";
string destFileName = "";
srcFileName = path + "InitVideo1.mp4";
destFileName = path + "InitVideo.mp4";
p.StartInfo.Arguments = "-i " + srcFileName + " -y -vcodec h264 -b 500000 " + destFileName; //执行参数
p.StartInfo.UseShellExecute = false; ////不使用系统外壳程序启动进程
p.StartInfo.CreateNoWindow = true; //不显示dos程序窗口
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中
//p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
//p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.StartInfo.UseShellExecute = false;
p.Start();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.BeginErrorReadLine();//开始异步读取
p.WaitForExit();//阻塞等待进程结束
p.Close();//关闭进程
p.Dispose();//释放资源
}
//// 去掉视频中的音频
//ffmpeg -i input.mp4 -vcodec copy -an output.mp4
//// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝
//// 提取视频中的音频
//ffmpeg -i input.mp4 -acodec copy -vn output.mp3
//// -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝
//// 音视频合成
//ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
//// -y 覆盖输出文件
////剪切视频
//ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
//// -ss 开始时间; -t 持续时间
//// 视频截图
//ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
// -s 设置分辨率; -f 强迫采用格式fmt;
//// 视频分解为图片
//ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg
//// -r 指定截屏频率
//// 将图片合成视频
//ffmpeg -f image2 -i image%d.jpg output.mp4
////视频拼接
//ffmpeg -f concat -i filelist.txt -c copy output.mp4
//// 将视频转为gif
//ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
//// -pix_fmt 指定编码
//// 将视频前30帧转为gif
//ffmpeg -i input.mp4 -vframes 30 -f gif output.gif
//// 旋转视频
//ffmpeg -i input.mp4 -vf rotate = PI / 2 output.mp4
// 缩放视频
// ffmpeg -i input.mp4 -vf scale = iw / 2:-1 output.mp4
// iw 是输入的宽度, iw/2就是一半;-1 为保持宽高比
//视频变速
// ffmpeg -i input.mp4 -filter:v setpts = 0.5 * PTS output.mp4
//音频变速
//ffmpeg -i input.mp3 -filter:a atempo = 2.0 output.mp3
//音视频同时变速,但是音视频为互倒关系
//ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
// 视频添加水印
// ffmpeg -i input.mp4 -i logo.jpg -filter_complex[0:v][1:v] overlay = main_w - overlay_w - 10:main_h-overlay_h-10[out] -map[out] -map 0:a -codec:a copy output.mp4
// main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距;
}
}