网上找了很多文章,结合自己的需要,写个FFmpeg的方法:
我用的是FFmpeg4.3.1:C#代码如下:
/// <summary>
/// 视频转码
/// </summary>
/// <param name="originalVideoFile">源视频文件</param>
/// <param name="objectVideoFile">目标视频文件</param>
/// <param name="addWatermark">是否水印</param>
/// <param name="isVideoCopy">是否仅转码复制</param>
/// <returns></returns>
public bool ConvertVideo(string originalVideoFile, string objectVideoFile, bool addWatermark = false, bool isVideoCopy = false)
{
bool isok = false;
//overlay=10:10 : 水印距离视频的左上角坐标
//右上角:overlay=main_w-overlay_w-10:10
//左下角:overlay=10:main_h-overlay_h-10
//右下角:overlay=main_w-overlay_w-10:main_h-overlay_h-10
//居中 overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2
string watermark = "";
if (addWatermark)
watermark = " -i " + Environment.CurrentDirectory + @"\Basic\watermark.png" + " -filter_complex \"overlay=main_w-overlay_w-10:5\" ";//水印 右上角
string vcodec = "";
if (isVideoCopy)
vcodec = " -vcodec copy "; //-vcodec copy:仅转码 执行速度快,文件大小不会变多少
//视频和分辨率对应关系 参考https://www.cnblogs.com/cai1432452416/p/11828008.html
Process p = new Process();//建立外部调用线程
p.StartInfo.FileName = Environment.CurrentDirectory + @"\Basic\ffmpeg.exe";//使用lgpl版本,涉及商业问题:lgpl版本允许使用,可以不开源项目。
//视频分辨率720X480 码率1800K(越高越清楚,文件也越大) 帧速率 25/S
p.StartInfo.Arguments = "-y -i " + originalVideoFile + watermark + " -s 720X480 -b:v 1800k -r 30 " + vcodec + " -f mp4 " + objectVideoFile; //参数(这里就是FFMPEG的参数了)
p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的
p.StartInfo.CreateNoWindow = false;//不创建进程窗口
try
{
p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
p.Start();//启动线程
p.BeginErrorReadLine();//开始异步读取
p.WaitForExit();//阻塞等待进程结束
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
return isok;
}
finally
{
if (p.HasExited && p.ExitCode == 1)
isok = false;
else
isok = true;
p.Close();//关闭进程
p.Dispose();//释放资源
}
return isok;
}
private static void Output(object sendProcess, DataReceivedEventArgs output)
{
Process p = sendProcess as Process;
if (p.HasExited && p.ExitCode == 1) // 在ffmpeg发生错误的时候才输出信息
{
//Console.WriteLine(output.Data);
// throw new Exception("视频处理失败");
}
}
项目下Basic文件夹下2个文件: