Почему FFmpeg не работает при запуске через пакетные файлы на Azure?

Вопрос или проблема

Я преобразую файл MP4 H264 в формат HLS, используя FFMPEG. Это работает на моих компьютерах с Windows 11 и 10, работает на локальной виртуальной машине Windows 11, также работает как на локальной виртуальной машине Windows Server, так и на базе Azure. Однако, когда я запускаю это на образе на основе Windows 2022 в Azure batch, оно не работает. Кто-нибудь сталкивался с таким поведением или у кого есть идеи, что я могу упускать?

Вот командная строка:

cmd /c %AZ_BATCH_APP_PACKAGE_ffmpeg#7.1%\ffmpeg-7.1-full_build\bin\ffmpeg.exe -i %AZ_BATCH_TASK_WORKING_DIR%/LowPriVMs-1.mp4 -v verbose -filter_complex "[0:v]split=1[v1]; [v1]scale=w=1920:h=1080[v1out];" -map "[v1out]" -c:v:0 mpeg4 -b:v:0 5000k -maxrate:v:0 5350k -bufsize:v:0 7500k -map a:0 -c:a aac -b:a:0 192k -ac 2 -f hls -hls_time 10 -hls_playlist_type vod -hls_flags independent_segments -hls_segment_type mpegts -hls_segment_filename out1/stream_%%v/data%%03d.ts -master_pl_name out1/master.m3u8 -var_stream_map "v:0,a:0" out1/stream_%%v/playlist.m3u8

Вывод из FFmpeg следующий:

ffmpeg version 7.1-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.100 / 61. 19.100
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
[Parsed_scale_1 @ 00000132a6f1cb00] w:1920 h:1080 flags:'' interl:0
[h264 @ 00000132a6f337c0] Reinit context to 640x368, pix_fmt: yuv420p
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'd:\batch\tasks\workitems\WinFFmpegJob\job-1\Task0\wd/LowPriVMs-1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2017-12-22T04:44:30.000000Z
  Duration: 00:02:00.14, start: 0.000000, bitrate: 759 kb/s
  Stream #0:0[0x1](eng): Video: h264 (Baseline), 1 reference frame (avc1 / 0x31637661), yuv420p(tv, progressive, left), 640x360 [SAR 1:1 DAR 16:9], 631 kb/s, 30 fps, 30 tbr, 30k tbn (default)
      Metadata:
        creation_time   : 2017-12-22T04:44:30.000000Z
        handler_name    : Mainconcept MP4 Video Media Handler
        vendor_id       : [0][0][0][0]
        encoder         : AVC Coding
  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
      Metadata:
        creation_time   : 2017-12-22T04:44:30.000000Z
        handler_name    : Mainconcept MP4 Sound Media Handler
        vendor_id       : [0][0][0][0]
[out#0/hls @ 00000132a6fbee40] Adding streams from explicit maps...
[out#0/hls @ 00000132a6fbee40] Creating output stream from an explicitly mapped complex filtergraph 0, output [v1out]
[vost#0:0/mpeg4 @ 00000132a6fbe780] Created video stream from complex filtergraph 0:[scale:default]
[vost#0:0/mpeg4 @ 00000132a6fbe780] 
[aost#0:1/aac @ 00000132a6f258c0] Created audio stream from input stream 0:1
[fc#0 @ 00000132a6f18700] Binding input with label '0:v' to input stream 0:0
Stream mapping:
  Stream #0:0 (h264) -> split:default
  scale:default -> Stream #0:0 (mpeg4)
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
[vost#0:0/mpeg4 @ 00000132a6fbe780] Starting thread...
[aost#0:1/aac @ 00000132a6f258c0] Starting thread...
[fc#0 @ 00000132a6f18700] Starting thread...
[af#0:1 @ 00000132a6fbea00] Starting thread...
[aist#0:1/aac @ 00000132a6f4cc00] [dec:aac @ 00000132a76318c0] Starting thread...
[vist#0:0/h264 @ 00000132a73f8c00] [dec:h264 @ 00000132a6f54a80] Starting thread...
[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 00000132a6f2ae80] Starting thread...
Press [q] to stop, [?] for help
[h264 @ 00000132a6f5ff80] Reinit context to 640x368, pix_fmt: yuv420p
[Parsed_scale_1 @ 00000132a6fbb440] w:1920 h:1080 flags:'' interl:0
[graph 0 input from stream 0:0 @ 00000132a7626900] w:640 h:360 pixfmt:yuv420p tb:1/30000 fr:30/1 sar:1/1 csp:unknown range:tv
[Parsed_scale_1 @ 00000132a6fbb440] w:640 h:360 fmt:yuv420p csp:unknown range:tv sar:1/1 -> w:1920 h:1080 fmt:yuv420p csp:unknown range:tv sar:1/1 flags:0x00000004
[Parsed_scale_1 @ 00000132a6fbb440] [framesync @ 00000132a6f1fda8] Selected 1/30000 time base
[Parsed_scale_1 @ 00000132a6fbb440] [framesync @ 00000132a6f1fda8] Sync level 1
[graph 0 input from stream 0:0 @ 00000132a7626900] video frame properties congruent with link at pts_time: 0
[graph_-1_in_0:1 @ 00000132a7625b00] tb:1/44100 samplefmt:fltp samplerate:44100 chlayout:stereo
[out#0/hls @ 00000132a6fbee40] Could not write header (incorrect codec parameters ?): Invalid argument
[af#0:1 @ 00000132a6fbea00] Error sending frames to consumers: Invalid argument
[af#0:1 @ 00000132a6fbea00] Task finished with error code: -22 (Invalid argument)
[af#0:1 @ 00000132a6fbea00] Terminating thread with return code -22 (Invalid argument)
[aist#0:1/aac @ 00000132a6f4cc00] [dec:aac @ 00000132a76318c0] Decoder returned EOF, finishing
[aist#0:1/aac @ 00000132a6f4cc00] [dec:aac @ 00000132a76318c0] Terminating thread with return code 0 (success)
[aist#0:1/aac @ 00000132a6f4cc00] All consumers of this stream are done
[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 00000132a6f2ae80] Terminating thread with return code 0 (success)
[vist#0:0/h264 @ 00000132a73f8c00] [dec:h264 @ 00000132a6f54a80] Decoder thread received EOF packet
[vist#0:0/h264 @ 00000132a73f8c00] [dec:h264 @ 00000132a6f54a80] Decoder returned EOF, finishing
[vist#0:0/h264 @ 00000132a73f8c00] [dec:h264 @ 00000132a6f54a80] Terminating thread with return code 0 (success)
[Parsed_scale_1 @ 00000132a6fbb440] [framesync @ 00000132a6f1fda8] Sync level 0
[fc#0 @ 00000132a6f18700] Filtergraph returned EOF, finishing
[fc#0 @ 00000132a6f18700] All consumers returned EOF
[fc#0 @ 00000132a6f18700] Terminating thread with return code 0 (success)
[aost#0:1/aac @ 00000132a6f258c0] Encoder thread received EOF
[aost#0:1/aac @ 00000132a6f258c0] Terminating thread with return code 0 (success)
[vost#0:0/mpeg4 @ 00000132a6fbe780] Encoder thread received EOF
[vost#0:0/mpeg4 @ 00000132a6fbe780] Terminating thread with return code 0 (success)
[out#0/hls @ 00000132a6fbee40] Nothing was written into output file, because at least one of its streams received no packets.
frame=    0 fps=0.0 q=5.1 Lsize=       0KiB time=N/A bitrate=N/A speed=N/A    
[aac @ 00000132a6f25c40] Qavg: nan
[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 00000132a6f2ae80] Input file #0 (d:\batch\tasks\workitems\WinFFmpegJob\job-1\Task0\wd/LowPriVMs-1.mp4):
[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 00000132a6f2ae80]   Input stream #0:0 (video): 73 packets read (287891 bytes); 72 frames decoded; 0 decode errors; 
[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 00000132a6f2ae80]   Input stream #0:1 (audio): 3 packets read (30 bytes); 2 frames decoded; 0 decode errors (2048 samples); 
[in#0/mov,mp4,m4a,3gp,3g2,mj2 @ 00000132a6f2ae80]   Total: 76 packets (287921 bytes) demuxed
[AVIOContext @ 00000132a6f25080] Statistics: 393216 bytes read, 0 seeks
Conversion failed!

Ответ или решение

FFmpeg является мощным инструментом для обработки видео и аудио, который широко используется благодаря своей универсальности и поддержке множества форматов. Тем не менее, при использовании его через пакетные файлы в Azure могут возникать различные проблемы, особенно при взаимодействии со специфическими конфигурациями операционной системы или самой облачной платформы.

Теория

Первым шагом в диагностики проблемы нужно учитывать особенности, связанные с запуском FFmpeg на различных системах. В данном случае, основное различие заключается в использовании Windows Server 2022 на Azure Batch. Windows Server 2022 может иметь некоторые отличия в конфигурации безопасности, доступности библиотек или поддержке определенных драйверов и системных вызовов, что может вызывать нетипичное поведение для FFmpeg.

На высоком уровне проблемы FFmpeg могут возникать из-за:

  • Отсутствия необходимых библиотек или компонентов;
  • Неисправных или недоступных путей к файлам и папкам;
  • Ограничений доступа и прав;
  • Недостатка системных ресурсов, например, памяти на выделенных виртуальных машинах.

Примером того, как это может проявляться, служит сообщение об ошибке: "Could not write header (incorrect codec parameters ?): Invalid argument". Это может указывать на проблему с настройками кодека, несовместимыми с текущей средой, или невозможностью записать файл в указанный путь, что в свою очередь может быть связано с ограничениями безопасности или привилегий.

Пример

Допустим, FFmpeg прекрасно работает на локальных машинах с Windows 10 и 11, а также в локальных виртуальных средах, но при попытке выполнить ту же команду в Azure, возникает ошибка записи заголовка. В данном случае, проблема может заключаться в особенностях конфигурации сети или безопасности на Azure, которые требуют специальной настройки для правильного функционирования FFmpeg. Возможно, в этих средах по умолчанию заблокированы определенные разрешения для записи в конкретные директории, что приводит к ошибке.

Также, другой важной деталью может быть версия сборки FFmpeg. Например, спецсборка может включать в себя компоненты, которые конфликтуют с другими элементами системы на Windows Server 2022 или имеют специфичные зависимости, не удовлетворенные на этой платформе.

Применение

  1. Проверка прав доступа. Убедитесь, что у вас есть соответствующие права на запись в директорию на Azure, где вы пытаетесь сохранить выходные файлы. Azure часто имеет более строгие ограничения безопасности по сравнению с локальными системами, и это нужно учесть.

  2. Диагностика зависимостей. Проверьте необходимость дополнительных системных библиотек, которые могут быть не предустановлены на Windows Server 2022 в Azure. Некоторые компонентные библиотеки могут отсутствовать и если FFmpeg требует их для полной корректной работы, это вызовет сбой.

  3. Логи и сообщения об ошибках. Используйте расширенную опцию вывода в FFMpeg для получения более детальных логов, которые могут указать на более специфические проблемы. Выявление конкретных кодов ошибок поможет сосредоточить усилия на их устранении.

  4. Проверка совместимости версии. Убедитесь, что используемая версия FFmpeg совместима с архитектурой и настройками Windows Server 2022. Иногда обновление или, наоборот, понижение версии может устранить многие проблемы.

  5. Использование контейнеров. Рассмотрите возможность использования контейнеров Docker, которые могут создать более стабильную среду для запуска FFmpeg, поскольку контейнеризация часто решает проблемы связанных с зависимостями и различиями в конфигурации.

На основе данной информации, проблемная ситуация на Azure может быть разрешена через тщательное изучение выдачи ошибок, улучшение конфигурации прав, обновление или изменение версии FFmpeg, а также возможное использование контейнерных служб для достижения лучшей совместимости и предсказуемости результата.

Оцените материал
Добавить комментарий

Капча загружается...