我这个不是写文章,是记录方便自己查阅,和有需要的人查看命令,因为我也是刚研究ffmpeg。
C#调用ffmpeg探索之路记录心得与命令使用方便自己查看
C# ffmpeg 命令大全
C# ffmpeg 命令大全
listcmd.Add(" -i " + 视频流);//-i 输入文件 可以网络地址也可以是本地路径
listcmd.Add("-y");//有重复文件直接覆盖 如果已经存在同名文件 则强制覆盖
listcmd.Add("udp://127.0.0.1:1111");//udp://127.0.0.1:1111 这里是一个本地的推流地址 用来做预览播放使用的
listcmd.Add("-c:v libx264");//后期可以用crf来控制大小
listcmd.Add("-c:v copy");//直接用copy的话体积特别大.
listcmd.Add("-c copy");//-c copy 直接复制音频以及视频流 不做任何转换
listcmd.Add("-f mpegts");//-f mepgts 将视频转换成ts视频流 //segment 表示分段
listcmd.Add("-f segment");//分段保存
listcmd.Add("-v verbose");//未知
listcmd.Add("-timeout 2000000");//未知
listcmd.Add("-loglevel error");//未知
listcmd.Add("-hide_banner");//未知
listcmd.Add("-analyzeduration 2147483647");//未知
listcmd.Add("-probesize 2147483647");//未知
listcmd.Add("-bufsize 5000k");//未知
listcmd.Add("-map 0");//未知
listcmd.Add("-sn");//未知
listcmd.Add("-dn");//未知
listcmd.Add("-bsf:v h264_mp4toannexb");//未知
listcmd.Add("-max_muxing_queue_size 1");//未知
//保存目录永远在最后
listcmd.Add(保存目录);//要跟上后戳.mp4 或者其他格式
ffmpeg批量合并视频命令操作
ffmpeg批量合并视频命令操作
如果合并的视频不用写到文档直接给命令就好了,这样就少了一步操作。
// ffmpeg目录\ffmpeg.exe
//要合并视频的目录是本地的.txt文档一行一个 文档存的数据是按照顺序来合并的从上到下
//下面是文档数据
//file 'C:\\Users\\Administrator\\Desktop\\准备合并视频\\准备合并视频1.mp4'
//file 'C:\\Users\\Administrator\\Desktop\\准备合并视频\\准备合并视频2.mp4'
//保存视频目录以及名称
//E:\短视频菜单\其他杂项\保存合并视频\合并后的.mp4
ffmpeg目录 - y - f concat - safe 0 - i 要合并视频的目录 - c copy 保存视频目录以及名称
ffmpeg直播流下载,并且分段保存,自动保存每个视频文件时间戳格式
List<string> listcmd = new List<string>();
listcmd.Add(" -i " + 直播流地址.flv);
listcmd.Add("-use_wallclock_as_timestamps 1");//如果设置为1,则使用系统时间作为时间戳。<br>默认值为0。
listcmd.Add("-vcodec copy");
listcmd.Add("-acodec copy");
listcmd.Add("-f segment");//分段保存
listcmd.Add("-reset_timestamps 1");//在每个段的开头重置时间戳,这样每个段将以接近零的时间戳开始。<br>默认为0。 可选值1或者0
listcmd.Add("-segment_atclocktime 1");//如果设置为“1”,则按从00:00开始的定时时钟间隔分割。<br>在 segment_time 中指定的时间值用于设置每段的长度 可选值1或者0
listcmd.Add("-segment_time " + 120);//分段 后面是几秒
listcmd.Add("-strftime 1"); //使用 strftime 函数定义要写入的文件的名称。< br > 如果选择此选项,输出段名称必须包含一个strftime函数模板。< br > 默认值为0。 //函数模板%Y%m%d%H%M
listcmd.Add(保存目录 + "%Y%m%d%H%M.mp4");
C#调用ffmpeg的一种方式
这个是取自FFmpeg.AutoGen
还有研究明白 如果程序主动取消任务 需要如何通知
public static void Run(string path, string args, string workDir = "")
{
string nowDir = Directory.GetCurrentDirectory(); //当前工作路径
if (workDir != "") Directory.SetCurrentDirectory(workDir);
Process p = new Process();//建立外部调用线程
p.StartInfo.FileName = path;//要调用外部程序的绝对路径
//Environment.SetEnvironmentVariable("FFREPORT", "file=" + ReportFile + ":level=32"); //兼容XP系统
//p.StartInfo.Environment.Add("FFREPORT", "file=" + ReportFile + ":level=32");
p.StartInfo.Arguments = args;//参数(这里就是FFMPEG的参数了)
p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)
p.StartInfo.CreateNoWindow = true;//不创建进程窗口
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
p.StartInfo.StandardErrorEncoding = Encoding.UTF8;
p.Start();//启动线程
p.BeginErrorReadLine();//开始异步读取
p.WaitForExit();//阻塞等待进程结束
p.Close();//关闭进程
p.Dispose();//释放资源
Environment.SetEnvironmentVariable("FFREPORT", null); //兼容XP系统
Directory.SetCurrentDirectory(nowDir);
}
/// <summary>
/// 在ffmpeg发生错误的时候才输出信息
/// </summary>
/// <param name="sendProcess"></param>
/// <param name="output"></param>
private static void Output(object sendProcess, DataReceivedEventArgs output)
{
if (!String.IsNullOrEmpty(output.Data))
{
Console.WriteLine(output.Data);
//LOGGER.PrintLine(output.Data, LOGGER.Warning);
}
//Process p = sendProcess as Process;
//if (p.HasExited && p.ExitCode == 1) // 在ffmpeg发生错误的时候才输出信息
//{
// Console.WriteLine(output.Data);
// // throw new Exception("视频处理失败");
//}
}