无法从Azure Function中的ffprobe获取输出

时间:2019-07-20 12:37:45

标签: azure azure-functions ffprobe

在Azure Function应用程序中,我通过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

有人知道这是什么错误吗?非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

不要将读取视频元数据任务委派给进程外可执行文件,而应尝试使用MediaInfo-

这里有一个from pandas import DataFrame import re d={'col': [1,2,3], 'col2': ['a.net',2,3]} df=DataFrame(columns=d.keys(), data=d) def mask0(s, pattern): s =str(s) if re.match(pattern, s): return s else: return 0 pat = re.compile('.+[\.net|\.com]') df['col2'] = df['col2'].apply(mask0, args=(pat,)) print(df) 的不错的包装器- https://github.com/StefH/MediaInfo.DotNetWrapper

MediaInfo.dll

metadata sample

有时,在给定一个陌生人或更旧的容器作为输入的情况下,MediaInfoWrapper w = new MediaInfoWrapper(@"C:\tmp\input.mov"); 无法读取元数据(不是很经常,但是仍然不理想)。在这些情况下,MediaInfo可以正常工作。

还有一个,这次是 FFmpeg - https://github.com/cmxl/FFmpeg.NET