无法从 Azure Function 中的 ffprobe 获取输出
Posted
技术标签:
【中文标题】无法从 Azure Function 中的 ffprobe 获取输出【英文标题】:Unable to get output from ffprobe within Azure Function 【发布时间】:2019-11-29 04:15:13 【问题描述】:在 Azure 函数应用程序中,我通过 blob 上传触发函数,使用 ffprobe 检索上传的 blob(视频文件)的元数据。
不知何故,我没有得到想要的输出。 ffprobe 可执行文件被识别(我得到 作为响应),但没有元数据输出。
这是我的函数的代码:
[FunctionName("ToConvertFileFunction")]
public static void Run([BlobTrigger("input/name", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
trace = log;
trace.LogInformation($"ConvertFile function processed blob\n Name:name \n Size: myBlob.Length Bytes");
var output = "";
var error = "";
var videoTempDir = string.Format(Path.GetDirectoryName("D:\\home\\site\\wwwroot\\tempfiles\\"));
var videoTempFile = name + ".MOV";
string videoTemp = Path.Combine(videoTempDir, videoTempFile);
using (var ms = new MemoryStream())
myBlob.CopyTo(ms);
File.WriteAllBytes(videoTemp, ms.ToArray());
var process = new Process();
process.StartInfo.FileName = Environment.GetEnvironmentVariable("ffprobePath");
process.StartInfo.Arguments = $"-v quiet -print_format json -show_entries stream_tags:format_tags -i videoTemp";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.Start();
trace.LogInformation("***Checking metadata***");
while (!process.StandardOutput.EndOfStream)
output += process.StandardOutput.ReadLine();
while (!process.StandardError.EndOfStream)
error += process.StandardError.ReadLine();
process.WaitForExit();
trace.LogInformation($"ffprobe output: output");
trace.LogInformation($"ffprobe error: error");
//Delete temp file
File.Delete(videoTemp);
trace.LogInformation("Done!");
我从路径D:\home\site\wwwroot\tools\ffprobe.exe
运行可执行文件并将我的临时视频文件保存在D:\home\site\wwwroot\tempfiles\
中
日志输出如下:
2019-07-20 12:21:51.453
***Checking metadata***
Information
2019-07-20 12:22:07.114
ffprobe output:
Information
2019-07-20 12:22:07.290
ffprobe error:
Information
2019-07-20 12:22:08.739
Done!
Information
2019-07-20 12:22:09.310
Executed 'ToConvertFileFunction' (Succeeded, Id=a873200e-965c-4f58-92d7-1f3b16ebc779)
Information
有人知道是什么导致了这里的错误吗?非常感谢您的帮助!
【问题讨论】:
根据我的经验,如果 ffprobe 不理解文件,它会输出
。你在本地测试过吗?
谢谢,你可能是对的。我在本地对其进行了测试,没有使用相同的 blob 文件,然后它就可以工作了。再次检查:当我下载 blob 文件(一个 .MOV 文件)时,我无法播放它,因此将 .MOV 上传到 Azure Blob 存储时出现问题。
在手动将 .MOV 文件添加到 blobstorage 时对其进行了测试,现在它可以工作了。问题来自我的上传功能。
【参考方案1】:
不要将读取视频元数据任务委托给进程外可执行文件,而是尝试使用MediaInfo -
这里有一个很好的 MediaInfo.dll
包装器 -
https://github.com/StefH/MediaInfo.DotNetWrapper
MediaInfoWrapper w = new MediaInfoWrapper(@"C:\tmp\input.mov");
有时,给定一个陌生人或旧容器作为输入,ffmpeg
无法读取元数据(不经常但仍然不理想)。 MediaInfo 在这些情况下工作得很好。
还有一个,这次是 FFmpeg - https://github.com/cmxl/FFmpeg.NET
【讨论】:
感谢您的建议,会检查一下!使用 FFprobe 和读取元数据时已经出现了一些意外行为。 FFmpeg 包装器是否也能够将单独的视频合并为一个? 这是什么 vs 主题? @HariHaran:Overnight Slumber。 @JJuice:没有实现连接(或者至少我在寻找它的 2 分钟内找不到它),发送 PR,应该易于编码,只需按照转换逻辑并添加多个输入。除非您的所有输入都是 MPEG-TS 片段,否则您需要重新编码。以上是关于无法从 Azure Function 中的 ffprobe 获取输出的主要内容,如果未能解决你的问题,请参考以下文章
从 Azure Function App 访问带有防火墙的 Azure Blob 存储
Azure Function (python) insert to Azure SQL 不断收到错误
从 Azure Sql 迁移到 Azure Synapse,无法连接到 Airflow 中的 Synapse