gpt4 book ai didi

azure - 如何使用 dotnet core 作为 Docker 中的 Azure 函数来运行 FFProbe?

转载 作者:行者123 更新时间:2023-12-02 18:01:41 31 4
gpt4 key购买 nike

我正在尝试根据 URL 从视频中获取视频详细信息(长度、高度、宽度和内容类型)。通过使用 nuget 包 https://www.nuget.org/packages/NReco.VideoInfo.LT我能够相当轻松地创建一个本地运行的 Azure 函数,指向我本地安装的 FFProbe。然而,现在的窍门是使其与 Azure Function 兼容,据我所知,最简单的方法是提供包含所需所有内容的 Docker 镜像(这将在 Linux 计算机上运行)。

那么,让我们进入代码。以前,如果我在本地运行该函数,这就是我所做的工作:

   var ffProbe = new NReco.VideoInfo.FFProbe();
ffProbe.FFProbeExeName = "ffprobe.exe"; // just "ffprobe" for Linux/OS-X
ffProbe.ToolPath = "C:\\tools\\ffmpeg\\bin";
var videoInfo = ffProbe.GetMediaInfo(videoUrl);

现在,(再说一次,这是我所知的最好的),为了让它使用 Docker 在 Linux 环境中运行,我遇到了几个问题。

所以,第一次尝试是我认为的简单方法,并尝试进行 apt-get install ffmpeg。这是 Dockerfile(抱歉,这将是一篇很长的文章......但最好展示我认为的所有内容):

   FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env

# 0. Install essential packages
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y ffmpeg

ENV AzureWebJobsStorage=""

COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot

RUN mkdir -p /home/site/wwwroot/bin
RUN mv /usr/bin/* /home/site/wwwroot/bin

# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet:3.0-appservice
FROM mcr.microsoft.com/azure-functions/dotnet:3.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true

COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]

我将代码更改为

   var ffProbe = new NReco.VideoInfo.FFProbe();
ffProbe.FFProbeExeName = "ffprobe"; // just "ffprobe" for Linux/OS-X
ffProbe.ToolPath = "/home/site/wwwroot/bin";
var videoInfo = ffProbe.GetMediaInfo(videoUrl);

可以构建,但是当我运行它时,出现错误:加载共享库时出错:libavdevice.so.58

所以,我做了一些挖掘,看起来我必须走手动构建路线。这并不理想,但我尝试一下并调整 Dockerfile:

   FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env

# 0. Install essential packages
RUN apt-get update -qq && apt-get -y install \
autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
pkg-config \
texinfo \
wget \
zlib1g-dev \
nasm \
yasm \
libx265-dev \
libnuma-dev \
libvpx-dev \
libmp3lame-dev \
libopus-dev \
libx264-dev

RUN mkdir -p /home/site/wwwroot

RUN mkdir -p /home/site/wwwroot/ffmpeg_sources /home/site/wwwroot/bin && cd /home/site/wwwroot/ffmpeg_sources && \
wget -O ffmpeg-4.3.1.tar.bz2 https://ffmpeg.org/releases/ffmpeg-4.3.1.tar.bz2 && \
tar xjvf ffmpeg-4.3.1.tar.bz2 && \
cd ffmpeg-4.3.1 && \
PATH="/home/site/wwwroot/bin:$PATH" PKG_CONFIG_PATH="/home/site/wwwroot/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="/home/site/wwwroot/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I/home/site/wwwroot/ffmpeg_build/include" \
--extra-ldflags="-L/home/site/wwwroot/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--bindir="/home/site/wwwroot/bin" \
--enable-gpl \
--enable-libass \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree && \
PATH="/home/site/wwwroot/bin:$PATH" make -j8 && \
make install -j8 && \
hash -r

ENV AzureWebJobsStorage=""

COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
dotnet publish *.csproj --output /home/site/wwwroot

FROM mcr.microsoft.com/azure-functions/dotnet:3.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true

COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]

再次构建,然后我尝试运行,这次遇到相同的错误,但文件不同:加载共享库时出错:libxcb.so.1

所以,我应该提到 Docker 对我来说有点新,所以我可能会错过一些简单的东西。但我整晚都在试图解决这个问题,直到我决定需要一些建议。我的主要应用程序也托管在 Linux 机器上,所以那是不行的。除了 Azure Function 方法之外,另一个疯狂的想法是以每月 20 美元的价格运行一个低优先级的 Windows VM……但随后我必须配置 IIS 和所有这些东西。因此,如果能弄清楚我做错了什么或者它是否可行,那就太好了。之前我已经让 Python/Selenium 使用 Docker 和 Azure Functions 工作 https://github.com/rebremer/azure-function-selenium.. 。所以我希望这只是我对 Docker 不够熟悉。

任何帮助我完成这项工作的帮助将不胜感激。如果您有任何疑问,请随时提问。

谢谢!

最佳答案

当我意识到 Docker 中的 Azure Functions 镜像基本上都是从 Ubuntu 开始时,我的解决方案最终不再使用另一个 Docker 镜像。意识到这一点,我的 Dockerfile 就变成了

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env

COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot

FROM mcr.microsoft.com/azure-functions/dotnet:3.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true \
AzureWebJobsStorage=""

COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]

RUN apt-get update && apt-get install -y ffmpeg

所以,它最终成为一个非常简单的解决方案。让 Azure 构建镜像,将网站复制到 wwwroot,然后像在 Ubuntu 上通常那样安装 ffmpeg!然后,只需将代码更新为:

var ffProbe = new NReco.VideoInfo.FFProbe();
ffProbe.FFProbeExeName = "ffprobe"; // just "ffprobe" for Linux/OS-X
ffProbe.ToolPath = "/usr/bin";
var mediaInfo = ffProbe.GetMediaInfo(videoUrl);

就是这样!

关于azure - 如何使用 dotnet core 作为 Docker 中的 Azure 函数来运行 FFProbe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63297514/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com