Вопрос или проблема
Я преобразую файл 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 или имеют специфичные зависимости, не удовлетворенные на этой платформе.
Применение
-
Проверка прав доступа. Убедитесь, что у вас есть соответствующие права на запись в директорию на Azure, где вы пытаетесь сохранить выходные файлы. Azure часто имеет более строгие ограничения безопасности по сравнению с локальными системами, и это нужно учесть.
-
Диагностика зависимостей. Проверьте необходимость дополнительных системных библиотек, которые могут быть не предустановлены на Windows Server 2022 в Azure. Некоторые компонентные библиотеки могут отсутствовать и если FFmpeg требует их для полной корректной работы, это вызовет сбой.
-
Логи и сообщения об ошибках. Используйте расширенную опцию вывода в FFMpeg для получения более детальных логов, которые могут указать на более специфические проблемы. Выявление конкретных кодов ошибок поможет сосредоточить усилия на их устранении.
-
Проверка совместимости версии. Убедитесь, что используемая версия
FFmpeg
совместима с архитектурой и настройками Windows Server 2022. Иногда обновление или, наоборот, понижение версии может устранить многие проблемы. -
Использование контейнеров. Рассмотрите возможность использования контейнеров Docker, которые могут создать более стабильную среду для запуска
FFmpeg
, поскольку контейнеризация часто решает проблемы связанных с зависимостями и различиями в конфигурации.
На основе данной информации, проблемная ситуация на Azure может быть разрешена через тщательное изучение выдачи ошибок, улучшение конфигурации прав, обновление или изменение версии FFmpeg
, а также возможное использование контейнерных служб для достижения лучшей совместимости и предсказуемости результата.