【问题标题】:concatenate two videos using ffmpeg.使用 ffmpeg 连接两个视频。
【发布时间】:2017-02-11 07:18:04
【问题描述】:
     string strParam;          
        string Path_FFMPEG = @"C:\Windows\system32\cmd.exe";
        string WorkingDirectory = @"C:\Users\Braintech\documents\visual studio 2013\Projects\convertVideo\convertVideo";            
        string command1 = "ffmpeg -i video1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts";
        string command2 = "ffmpeg -i video2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts";
        string command3 = "ffmpeg -i" + "concat:intermediate1.ts|intermediate2.ts" + " -c copy -bsf:a aac_adtstoasc Output.mp4";
        string Command = @"" + command1 + " & " + command2 + " & " + command3 + " ";      

        strParam = "ffmpeg -f concat -i " + file + " -c copy " + strResult;

        process(Path_FFMPEG, Command, WorkingDirectory);
   public static void process(string Path_FFMPEG, string Command, string WorkingDirectory)
    {
        try
        {           

            Process ffmpeg = new Process();
            ProcessStartInfo ffmpeg_StartInfo = new ProcessStartInfo(Path_FFMPEG, Command);
            ffmpeg_StartInfo.WorkingDirectory = WorkingDirectory;              
            ffmpeg_StartInfo.UseShellExecute = false;
            ffmpeg_StartInfo.RedirectStandardError = true;
            ffmpeg_StartInfo.RedirectStandardOutput = true;
            ffmpeg.StartInfo = ffmpeg_StartInfo;
            ffmpeg_StartInfo.CreateNoWindow = true;
            ffmpeg.EnableRaisingEvents = true;
            ffmpeg.Start();
            ffmpeg.WaitForExit(30000);              
            ffmpeg.Close();
            ffmpeg.Dispose();
            ffmpeg = null;
        }
        catch (Exception ex)
        {

        }
    }

我正在尝试使用 ffmpeg 合并两个视频。但它是手动工作但无法使用 c# 代码执行。当我在 cmd 上手动运行命令时它可以工作。但是当我尝试使用 c# 运行时,它不起作用。请帮助某人。 提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    基本上,不要尝试将其加载到数组中。对于大文件,您应该拥有一系列采用路径或 StreamFile() 方法的重载,并且知道该怎么做。例如:

    return File("/TestVideo/Wildlife.wmv", "video/x-ms-wmv");
    

    或:

    return File(videoPath, "video/x-ms-wmv");
    

    但是,视频确实是一种特殊情况,可能会受益于更专业的处理。

    【讨论】:

    • 我必须返回它才能在 android 应用程序中播放视频而不点击视频网址。所以我想在 api 中发送字节数组并在客户端转换视频和播放。
    • @SunilKumar 将视频加载到字节数组中是一个糟糕的想法,而且永远不会奏效;这不是您应该处理大文件的方式。所以要么你需要一个流 API(FileResult 知道在这里做什么),要么你需要多个小请求(可怕)。
    • 文件结果在 api 控制器中不显示
    • @SunilKumar 那么您需要以不同的方式进行操作;是否支持将 Stream 作为返回值?
    • 对于大型视频流,请求非常大,它不起作用。它会停止请求。
    【解决方案2】:

    返回 byte 数组确实不行。
    因此,与其将整个视频作为 byte 数组返回,不如将其保存在某个地方(例如您的 Web API),如果不是的话已保存为文件,并将视频 URI 作为响应发回?

    您要使用的视频播放器肯定知道如何处理该 URI。

    另一种选择是在您的 Web API 中启用 206 PARTIAL CONTENT 支持,并在您的视频播放器中使用您的 Web API 的 URI。

    请看这里https://stackoverflow.com/a/33634614/2528907

    【讨论】:

    • 实际上出于安全原因我不想在响应中发送视频网址。我只想发送字节数组或任何其他合适的解决方案,通过它们我可以在响应中发送 who;e 视频,它将使用 android 应用程序播放而无需点击服务器视频 url。
    • 好吧,如果这是您的问题,实际上您的用户也可以找出发送字节数组的端点。 PARTIAL CONTENT 选项呢?
    • 我使用的是部分内容,但对于大型视频,它也无法正常工作,并且会导致请求崩溃。
    【解决方案3】:

    问题在于路径。你应该在你的命令中给出文件路径

    下面的代码可能会有所帮助

    mylist.txt 文件包含在其中

    文件'01.mp4' 文件'04.mp4'

    Dim _ffmpeg As String = "D:\Develop\Experiment\mergermp4Vb\mergermp4Vb\Videos\ffmpeg.exe"
     Dim   params = "-f concat -i D:\Develop\Experiment\mergermp4Vb\mergermp4Vb\Videos\mylist2.txt -c copy D:\Develop\Experiment\mergermp4Vb\mergermp4Vb\Videos\0104.mp4"
        Dim _FFmpegProcessPropertys As New ProcessStartInfo
        _FFmpegProcessPropertys.FileName = _ffmpeg
    
        _FFmpegProcessPropertys.Arguments = params
        _FFmpegProcessPropertys.UseShellExecute = False
        _FFmpegProcessPropertys.RedirectStandardOutput = True
        _FFmpegProcessPropertys.RedirectStandardError = True
        _FFmpegProcessPropertys.CreateNoWindow = True
        Dim FFmpegProcess = Process.Start(_FFmpegProcessPropertys)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2012-03-09
      • 1970-01-01
      • 2019-01-04
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多