在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
有人知道这是什么错误吗?非常感谢您的帮助!
答案 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
有时,在给定一个陌生人或更旧的容器作为输入的情况下,MediaInfoWrapper w = new MediaInfoWrapper(@"C:\tmp\input.mov");
无法读取元数据(不是很经常,但是仍然不理想)。在这些情况下,MediaInfo可以正常工作。
还有一个,这次是 FFmpeg - https://github.com/cmxl/FFmpeg.NET