繁体   English   中英

C# 从 stream 读取视频/音频/图像文件元数据

[英]C# Reading Video / Audio / Image file metadata from a stream

我目前正在寻找在 C# 中编写 AWS Lambda function

  1. 上传到 S3 的文件触发我的 Lambda
  2. Lambda 查询文件并获取有关视频编解码器、帧速率、音频通道、持续时间的技术元数据
  3. Lambda 将该数据发布到另一个服务

我查看了 Nuget 上的 MediaInfo 和 FFMPeg 包装器,但问题是它们都接受 FilePaths 来打开文件,而在 S3 / Lambda 土地上我正在使用流。

我不想创建一个 EFS 来临时存储文件,因为它看起来有点矫枉过正,而且我认为图书馆也不需要读取整个 stream 来获取元数据。

基本上我想做的与类似,但我是一个 .net 的人,宁愿不学习 Python / Docker / Linux 等......

您可以使用 C# 中的 MediaInfo 库,没有安装程序DLL具有 C# 绑定,还有一个 C# MediaInfo 绑定示例,它通过提供 URL(HTTP、FTP、S3...)提供有关如何使用 MediaInfo 库的信息或通过缓冲区(您自己获取内容,在 C# 中,因为您是唯一知道如何获取流的人)从您的流中获取缓冲区数据,并将缓冲区数据发送到 MediaInfo; MediaInfo 表示何时不需要更多数据,因此不会读取整个流)。

Jérôme,MediaInfo 的开发者

为了确保您将支持所有格式(分路器/编解码器),我将使用 FFmpeg.Autogen .NET 绑定与 FFmpeg win 构建。 然后,您可以获得所有流所需的所有信息(包括编解码器和元数据)。

(不熟悉 AWS lambda 所以不确定这是否有效)

只是想在这里添加,因为我已经花了好几个小时在这上面(虽然文档没问题,但我觉得它有利于重组)。

对于 C# 框架:

  1. 下载DLL并放入debug文件夹
  2. 下载包装器 class wrapper cs并将其放在您的项目中
  3. 对于 S3,您还需要 bin/debug 文件夹中的libcurl.dll
  4. 测试代码:

 using System.IO; using MediaInfoLib; namespace MediaInfoNetFramework { internal class Program { static void Main(string[] args) { var purl = "https://presignedS3URL"; MediaInfo MI = new MediaInfo(); MI.Open(purl); MI.Option("Complete"); var x = MI.Inform(); MI.Close(); return; } } }

笔记:

  1. 您可以将 DLL 包含在 bin 文件夹中,包含在项目中,并在属性上复制到 output。这样它们总是被复制到 debug/release 文件夹中。
  2. 如果在运行时它说无法加载 mediainfo,请尝试其他 32 位或 64 位 DLL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM