C#调用cmd执行ffmpeg视频转换,本地测试可以,放服务器不能执行的解决方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42524279/article/details/84674430
  //安装的ffmpeg的路径 写在配置文件的 你也可以直接写你的路径 D:\ffmpeg\bin\ffmpeg.exe
        static string FFmpegPath = System.Configuration.ConfigurationManager.AppSettings["ffmepg"];

        /// <summary>
        /// 视频转码为ts文件
        /// </summary>
        /// <param name="videoUrl"></param>
        /// <param name="targetUrl"></param>
        public static void VideoToTs(string videoUrl, string targetUrl)
        {
            //视频转码指令
            string para = $@"ffmpeg -y -i {videoUrl} -vcodec copy -acodec copy -vbsf h264_mp4toannexb {targetUrl}";
            RunMyProcess(para);
        }

        /// <summary>
        /// 将ts文件转换为mu3u8文件
        /// </summary>
        /// <param name="tsUrl"></param>
        /// <param name="m3u8Url">这个路径不要带扩展名</param>
        public static void TsToM3u8(string tsUrl, string m3u8Url)
        {           
            //视频转码指令
            //string para = $@"ffmpeg -i {tsUrl} -c copy -map 0 -f segment -segment_list {m3u8Url}.m3u8 -segment_time 5 {m3u8Url}-%03d.ts";
	        //这里是关键点,一般平时切视频都是用FFmpeg -i  地址 -c这样,但是在服务器时,这样调用可能找不到ffmpeg的路径 所以这里直接用ffmpeg.exe来执行命令
            string para = $@"{FFmpegPath} -i {tsUrl} -c copy -map 0 -f segment -segment_list {m3u8Url}.m3u8 -segment_time 5 {m3u8Url}-%03d.ts";
            RunMyProcess(para);
        }

        /// <summary>
        /// 执行cmd指令
        /// </summary>
        /// <param name="Parameters"></param>
        public static void RunMyProcess(string Parameters)
        {
            using (Process p = new Process())
            {
                try
                {
                    p.StartInfo.FileName = "cmd.exe";
                    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(Parameters + "&&exit");
                    p.StandardInput.AutoFlush = true;
                    p.StandardInput.Close();
                    //获取cmd窗口的输出信息
                    string output = p.StandardError.ReadToEnd(); //可以输出output查看具体报错原因
      
                    //等待程序执行完退出进程
                    p.WaitForExit();
                    p.Close();
                 
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

一般平时切视频都是用FFmpeg -i 地址 -c这样,但是在服务器时,这样调用可能找不到ffmpeg的路径 所以这里直接用ffmpeg.exe来执行命令

也有可能是权限问题,如果不是权限问题,那么基本就是我说的这种情况了,至于权限的问题那么自己百度一哈,一般是在IIS应用池里设置默认设置,改进程模型的标识为localSystem

展开阅读全文

XML写入在本地可以执行但在servlet上不能执行

01-03

如题,在本地的java程序试过了,可以输出,但是写到servlet里,用一个jsp的表单提交转到servlet里再执行怎么也写不出文件了,本以为是eclipse权限问题,但在管理员权限下运行也不行,求教!!rn页面:rn[code=html]rn<%@ page language="java" contentType="text/html; charset=utf-8"rn pageEncoding="utf-8"%>rnrnrnrn rn 写入XMLrnrnrn rn rnrnrnrn[/code]rnservletrn[code=java]rnpackage sjw.pratice;rnrnimport java.io.File;rnimport java.io.FileWriter;rnimport java.io.IOException;rnimport java.sql.ResultSet;rnimport java.sql.ResultSetMetaData;rnimport java.sql.SQLException;rnrnimport javax.servlet.ServletException;rnimport javax.servlet.annotation.WebServlet;rnimport javax.servlet.http.HttpServlet;rnimport javax.servlet.http.HttpServletRequest;rnimport javax.servlet.http.HttpServletResponse;rnrnimport org.dom4j.Document;rnimport org.dom4j.DocumentHelper;rnimport org.dom4j.Element;rnimport org.dom4j.io.OutputFormat;rnimport org.dom4j.io.XMLWriter;rnrn@WebServlet("/OutXML")rnpublic class OutXML extends HttpServlet rn private static final long serialVersionUID = 1L;rn rn public OutXML() rn super();rn // TODO Auto-generated constructor stubrn rnrn protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException rn // TODO Auto-generated method stubrn rnrn protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExceptionrn MethodOfSQL.GetConnection();rn String demand="select * from contactor";rn ResultSet rs=null;rn try rn rn rs=MethodOfSQL.SelectSQL(demand);rn rn catch (Exception e) rn rn e.printStackTrace();rn rn Document document=DocumentHelper.createDocument();rn Element root=document.addElement("contactorlist");rn if(rs!=null)rn rn try rn rn while(rs.next())rn rn Element row=root.addElement("contactor");rn ResultSetMetaData rsmd=rs.getMetaData();rn int columnCount=rsmd.getColumnCount();rn for(int i=1;i<=columnCount;i++)rn rn Element element = row.addElement(rsmd.getColumnName(i));rn if(rs.getObject(i)!=null)rn rn element.setText(rs.getObject(i).toString());rn rn elsern rn element.setText("");rn rn rn rn rn catch (SQLException e) rn rn e.printStackTrace();rn rn tryrn rn XMLWriter writer=new XMLWriter(new FileWriter(new File("contactout.xml")));rn writer.write(document);rn writer.close();rn rn catch (IOException e)rn rn e.printStackTrace();rn rn rn rnrn[/code] 论坛

[求助]C#执行CMD没有执行结果问题

09-06

因为要执行CMD命令昨天写的一块代码去执行bcdedit,当时执行这段代码是没什么问题的,可以返回一句执行成功的话,但是今天返回值成空了,今天运行的结果如下:rnMicrosoft Windows [Version 6.1.7601]rnCopyright (c) 2009 Microsoft Corporation. All rights reserved.rnC:\\Users\\Documents\\Visual Studio 2010\\Projects\\Tmp\\Tmp\\bin\\Debug>time /trn18:33rnC:\\Users\\Documents\\Visual Studio 2010\\Projects\\Tmp\\Tmp\\bin\\Debug>bcdedit /set current bootstatuspolicy ignoreallfailuresrnrn上面一条测试用的可以输出返回值时间,但下面一条,单独在cmd里执行是有结果的,昨天刚写完初步测试也是有返回结果的,输出“The operation completed successfully.”,但是今天再运行这块代码的时候没有输出操作成功的结果,这中间我是什么都没有更改的,代码还是以前的代码,←不想说“昨天”、“今天”这种不科学的论调但是很诡异调了一下午了求帮助求灵感一 一……以下是代码……rn rn Process process = new Process();rn process.StartInfo.FileName = @"cmd.exe";rn process.StartInfo.UseShellExecute = false;rn process.StartInfo.RedirectStandardInput = true;rn process.StartInfo.RedirectStandardOutput = true;rn process.StartInfo.RedirectStandardError = true;rn process.StartInfo.CreateNoWindow = true;rn process.Start();rn process.StandardInput.AutoFlush = true;rn process.StandardInput.WriteLine("bcdedit /set current bootstatuspolicy ignoreallfailures");rn process.StandardInput.WriteLine("");rn process.StandardInput.WriteLine("exit");rnrn string output = process.StandardOutput.ReadToEnd();rn MessageBox.Show(output);rn process.Close(); 论坛

没有更多推荐了,返回首页