Ffmpeg的一些问题

问题描述 投票:0回答:1

我不知道为什么 Ffmpeg 可以工作,但它给出了一个错误。 你怎么能在这段代码中看到我的 ffmpeg 已启动并开始合并媒体文件。媒体归档他的合并,但他给出了一个错误,我不知道为什么会发生这种情况。

enter image description here

错误发生在这行代码中

enter image description here

他引发了“if”,而我的方法返回了 false。但他合并我的音频和视频仍然有效。我给你我所有的代码

public static async Task<bool> VideoHighQuality(YoutubeClient youtube, string url)
{
    try
    {
        var video = await youtube.Videos.GetAsync(url);
        var title = video.Title;
        var safeTitle = string.Join("_", title.Split(Path.GetInvalidFileNameChars()));

        var streamManifest = await youtube.Videos.Streams.GetManifestAsync(url);
        var videoStreamInfo = streamManifest.GetVideoOnlyStreams()
            .Where(s => s.VideoQuality.Label.StartsWith("1080"))
            .FirstOrDefault() ?? streamManifest.GetVideoOnlyStreams()
            .OrderByDescending(s => s.VideoQuality)
            .FirstOrDefault();
        var audioStreamInfo = streamManifest.GetAudioOnlyStreams().GetWithHighestBitrate();

        if (videoStreamInfo != null && audioStreamInfo != null)
        {
            var outputPath = Path.Combine("E:\\films", $"{safeTitle}_merged.{videoStreamInfo.Container}");
            var videoTempPath = Path.Combine("E:\\films", $"video_{safeTitle}.{videoStreamInfo.Container}");
            var audioTempPath = Path.Combine("E:\\films", $"audio_{safeTitle}.{audioStreamInfo.Container}");

            await youtube.Videos.Streams.DownloadAsync(videoStreamInfo, videoTempPath);
            await youtube.Videos.Streams.DownloadAsync(audioStreamInfo, audioTempPath);

           var mergeSuccess = await MergeVideo(videoTempPath, audioTempPath, outputPath);

            File.Delete(videoTempPath);
            File.Delete(audioTempPath);

            Console.WriteLine($"Video successfully processed and saved to: {outputPath}");


            return mergeSuccess;
        }
        else
        {
            Console.WriteLine("Suitable video or audio stream not found.");
            return false;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
        return false;
    }


    
}
 private static async Task<bool> MergeVideo(string videoPath, string audioPath, string outputPath)
 {
     try
     {
         Console.WriteLine("Starting MergeVideo method.");

         var ffmpeg = new Process
         {
             StartInfo = new ProcessStartInfo
             {
                 FileName = @"C:\Users\romap\source\repos\VideoDownloader\Ffmpeg\ffmpeg.exe",
                 Arguments = $"-i \"{videoPath}\" -i \"{audioPath}\" -c:v copy -c:a aac -strict experimental \"{outputPath}\"",
                 RedirectStandardOutput = true,
                 RedirectStandardError = true,
                 UseShellExecute = false,
                 CreateNoWindow = true
             }
         };

         ffmpeg.Start();

         var outputTask = ffmpeg.StandardOutput.ReadToEndAsync();
         var errorTask = ffmpeg.StandardError.ReadToEndAsync();

         await ffmpeg.WaitForExitAsync();

         string output = await outputTask;
         string error = await errorTask;

         Console.WriteLine("FFmpeg process completed.");

         if (!string.IsNullOrEmpty(error))
         {
             Console.WriteLine($"FFmpeg Error: {error}");
             return false;
         }

         return true;
     }
     catch (Exception ex)
     {
         Console.WriteLine($"An error occurred in MergeVideo: {ex.Message}");
         return false;
     }
 }

我尝试了很多理由来探索这个解决方案。

使用GPT和Claude,但他没有帮助我。我实际上不明白如何解决这个问题,因为我第一次这样做

c# asp.net .net async-await process
1个回答
0
投票
与大多数 Linux 工具一样,

ffmpeg
将人类可读的日志打印到 stderr,将机器可读的文本打印到
stdout
。这使得可以轻松地将 ffmpeg 的标准输出传输到另一个工具(如
ffplay
),同时仍然能够将人类可读的日志打印到
stderr

如果您希望

ffmpeg
仅将错误日志打印到
stderr
(并跳过其他信息日志),请使用
-loglevel
标志。特别是对于
ffmpeg
,我更喜欢仅检查退出代码来确定
ffmpeg
是否失败,因为在生产中运行时您可能需要收集警告日志。

© www.soinside.com 2019 - 2024. All rights reserved.