无法从 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 主题? @HariHaranOvernight Slumber@JJuice:没有实现连接(或者至少我在寻找它的 2 分钟内找不到它),发送 PR,应该易于编码,只需按照转换逻辑并添加多个输入。除非您的所有输入都是 MPEG-TS 片段,否则您需要重新编码。

以上是关于无法从 Azure Function 中的 ffprobe 获取输出的主要内容,如果未能解决你的问题,请参考以下文章

Azure 流分析无法触发 Azure Function

从 Azure Function App 访问带有防火墙的 Azure Blob 存储

Azure Function (python) insert to Azure SQL 不断收到错误

从 Azure Sql 迁移到 Azure Synapse,无法连接到 Airflow 中的 Synapse

Azure Function v3 - 在启动中添加标识时“无法访问 Azure Functions 运行时”

Azure(函数)参数在 Python 中声明,但不在 function.json 中