Я что-то делаю неправильно, или вариант с резьбой в «avconv» сломан? Я попробовал вариант «-threads» с H264 и mpeg2video и независимо от того, какое значение я ему даю (от 0 до 4), нет никакой разницы в производительности вообще.
Если я разбиваю экран на несколько фрагментов 640×640 и запускаю отдельные экземпляры avconv для каждого одновременно, я получаю 90 FPS на каждый.
Если я просто создаю один поток ffmpeg 2560×1440, я получаю 12 FPS.
Так ясно, что потоки работают на системном уровне, но не в avconv.
На стороне клиента я могу использовать черепичные экземпляры mplayer, это не проблема. Там много фликкерных сбоев, где буфер изображения одного потока показан в другом. (Я использую разные номера портов UDP для каждой плитки, так что это не так). Я подозреваю, что это сбой avconv, где он не предназначен для запуска в нескольких экземплярах и поэтому имеет общий вид своего буфера.
Команда, которую я использую:
avconv -f x11grab -s 640x640 -фрагмент 180 -i: 0.0 + 320,400 -c: v mpeg2video -q: v 20 -pix_fmt yuv420p -g 1 -threads 4 -f mpegts udp: //192.168.0.7: 1231
Версия Avconv / ffmpeg:
avconv -версия ffmpeg версия 2.8.8-0ubuntu0.16.04.1 Авторские права (c) 2000-2016 разработчики FFmpeg построенный с использованием gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.2) 20160609 Конфигурация: --prefix = / usr --extra-version = 0ubuntu0.16.04.1 --build-suffix = -ffmpeg --toolchain = hardened --libdir = / usr / lib / x86_64-linux-gnu --incdir = / usr / include / x86_64-linux-gnu --cc = cc --cxx = g ++ --enable-gpl --enable-shared --disable-stripping --disable-decoder = libopenjpeg --disable-decoder = libschroedinger - -enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite - -enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse - -enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis - -enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100
Что касается процессоров:
процессор: 0 vendor_id: AuthenticAMD cpu family: 21 модель: 1 Название модели: AMD FX (tm) -4170 Quad-Core Processor степпинг: 2 микрокод: 0x6000629 cpu МГц: 2900.000 размер кеша: 2048 КБ физический идентификатор: 0 братья и сестры: 4 core id: 0 Процессоры: 2 апицид: 0 исходный апицид: 0 fpu: да fpu_exception: да Уровень cpuid: 13 wp: да флаги: FPU VME-де-псевдоэфедрин TSC MSR пае MCE CX8 APIC SEP MTRR PGE MCA CMOV погладить pse36 clflush MMX fxsr сс sse2 ХТЫ системного вызова ого mmxext fxsr_opt pdpe1gb rdtscp ого constant_tsc rep_good nopl nonstop_tsc extd_apicid aperfmperf ПНИ PCLMULQDQ монитор SSSE3 CX16 sse4_1 sse4_2 POPCNT АЕС XSAVE AVX lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 nodeid_msr topoext perfctr_core perfctr_nb cpb hw_pstate vmmcall arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold bugs: fxsave_leak sysret_ss_attrs bogomips: 8456,93 Размер TLB: 1536 страниц 4K размер clflush: 64 cache_alignment: 64 размер адресов: 48 бит физического, 48 бит виртуальных управление питанием: ts ttp tm 100mhzsteps hwpstate cpb ...и так далее
Приложение представляет собой поточную виртуальную реальность. Он должен быть 90 FPS без латентности. Если разделить на плитки, то частота кадров не является проблемой, которая доказывает, что потоки перепутаны. Единственным кодеком, который не представляет заметной задержки, является mpeg2video.
Я также загрузил и скомпилировал исходный файл ffmpeg версии 3.2.2 и получил те же результаты.