我不知道为什么 Ffmpeg 可以工作,但它给出了一个错误。 你怎么能在这段代码中看到我的 ffmpeg 已启动并开始合并媒体文件。媒体归档他的合并,但他给出了一个错误,我不知道为什么会发生这种情况。
错误发生在这行代码中
他引发了“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,但他没有帮助我。我实际上不明白如何解决这个问题,因为我第一次这样做
ffmpeg
将人类可读的日志打印到 stderr,将机器可读的文本打印到 stdout
。这使得可以轻松地将 ffmpeg 的标准输出传输到另一个工具(如 ffplay
),同时仍然能够将人类可读的日志打印到 stderr
。
如果您希望
ffmpeg
仅将错误日志打印到 stderr
(并跳过其他信息日志),请使用 -loglevel
标志。特别是对于 ffmpeg
,我更喜欢仅检查退出代码来确定 ffmpeg
是否失败,因为在生产中运行时您可能需要收集警告日志。