Вот мои шаги, чтобы сделать это выше, как показано ниже, надеюсь, это поможет.
Следуйте официальному руководству по функциям Azure для Python, чтобы установить Azure Functions Core Tools
на мою локальную машину Windows, чтобы создать проект с именем MyFunctionProj
и функцию с именем HttpTrigger
.
Перед загрузкой ffmpeg
с развертыванием я проверяю архитектуру платформы ОС моего экземпляра функций Azure в Azure, изменяя официальный пример кода с помощью приведенного ниже кода.
# add these codes
import platform, os
.....
def main(req: func.HttpRequest) -> func.HttpResponse:
if name:
return func.HttpResponse(f"Hello {name}! {platform.architecture()}")
Его результат - Hello peter-pan! ('64bit', '')
в браузере.
Затем я помещаю статический двоичный файл ffmpeg
AMD64, загруженный из https://johnvansickle.com/ffmpeg/, в свой MyFunctionProj
и изменяю мой код ниже, чтобы проверить путь к файлу, и команду func azure functionapp publish <my app name>
для публикации в Azure.
def main(req: func.HttpRequest) -> func.HttpResponse:
if name:
return func.HttpResponse(f"Hello {name}! {platform.architecture()} {os.listdir()} {os.listdir('HttpTrigger')}")
Его результат равен Hello peter-pan! ('64bit', '') ['in.mp4', 'ffmpeg', 'host.json', 'requirements.txt', 'ffmpeg.exe', '.python_packages', 'HttpTrigger'] ['in.mp4', '__pycache__', 'sample.dat', 'host.json', 'function.json', '__init__.py']
в броузере, как и в моем MyFunctionProj
Я обнаружил, что все в папке MyFunctionProj
будет загружено в Azure и вызовет os.listdir()
, чтобы показать список файлов MyFunctionProj
, поэтому текущий путь в Python такой же, как и MyFunctionProje
локально. Затем я попытался вызвать ffmpeg
в моей локальной среде Windows с помощью кода ниже.
def main(req: func.HttpRequest) -> func.HttpResponse:
if name:
return func.HttpResponse(f"Hello {name}! {platform.architecture()} {os.listdir()} {os.listdir('HttpTrigger')} {os.path.exists('in.mp4')} {os.popen('ffmpeg.exe -i in.mp4 out.mp4').read()} {os.path.exists('out.mp4')} {os.popen('del out.mp4').read()}")
Он работает для вывода файла out.mp4
с помощью команды ffmpeg.exe -i in.mp4 out.mp4
, а затем для воспроизведения его в команду del out.mp4
.
Попробуйте сделать так, чтобы это работало для среды Linux в Azure Function. Я изменяю команды с помощью ./ffmpeg -i in.mp4 out.mp4
и rm out.mp4
. Но это не сработало в функции Azure. Это может быть вызвано отсутствием разрешения на выполнение двоичного файла ffmpeg
linux при загрузке из Windows. Поэтому я проверил свое предположение с помощью команд ls -l ffmpeg
и chmod u+x ffmpeg
, прежде чем вызывать его.
def main(req: func.HttpRequest) -> func.HttpResponse:
if name:
return func.HttpResponse(f"Hello {name}! {platform.architecture()} {os.listdir()} {os.listdir('HttpTrigger')} {os.popen('ls -l ffmpeg').read()} {os.popen('chmod u+x ffmpeg').read()} {os.popen('ls -l ffmpeg').read()} {os.path.exists('in.mp4')} {os.popen('./ffmpeg -i in.mp4 out.mp4').read()} {os.path.exists('out.mp4')} {os.popen('rm out.mp4').read()}")
Теперь работает, результат примерно такой, как показано ниже. Я довольно красиво отформатировал.
Hello peter-pan! // Offical sample output
('64bit', '') // the Linux platform architecture of Azure Functions for Python
['in.mp4', 'ffmpeg', 'host.json', 'requirements.txt', 'ffmpeg.exe', '.python_packages', 'HttpTrigger'] // file list of MyFunctionProj
['in.mp4', '__pycache__', 'sample.dat', 'host.json', 'function.json', '__init__.py'] // file list of HttpTrigger
-r--r--r-- 1 root root 69563752 Mar 13 2019 ffmpeg // before chmod u+x
-rwxr--r-- 1 root root 69563752 Mar 13 2019 ffmpeg // after chmod u+x
True // in.mp4 exists
True // out.mp4 exists before delete it using `rm`