Улучшение производительности захвата экрана ffmpeg x11grab - PullRequest
0 голосов
/ 10 января 2020

Я делал захват только экрана (без звука), используя ffmpeg с libx264 для кодирования, довольно успешно на старой машине, построенной на процессоре Core2 Quad Q6600. Теперь мне нужно включить звук, но поклонники этой древней машины слишком громкие. Итак, я нашел безвентиляторную материнскую плату (https://www.asrock.com/mb/Intel/J5005-ITX/index.asp) с процессором Intel Pentium Silver J5005 и решил использовать ее вместо этого. Тесты ЦП помещают его в корпус, аналогичный Q6600, и общая производительность кажется значительно лучше, предположительно, по крайней мере отчасти, потому что теперь он использует память DDR4, что обеспечивает более быстрый доступ.

Однако машина ужасно дает сбой на снимке экрана. Это пропускает рамки повсюду; Я на самом деле получаю видео, пропускающее почти половину кадров, и воспроизводит с удвоенной скоростью. Кроме того, любой звук просто настолько испорчен, что я едва могу придумать, как его описать. Лучшее, что я могу придумать, это то, что я получаю, возможно, четверть секунды звука, а затем паузу в несколько секунд (видео тем временем фактически воспроизводится, хотя и без чувства времени).

Некоторые вещи происходят со мной, которые могут быть причиной или излечением моих проблем, некоторые из которых я мог бы исправить, другие не так много. Какие еще вещи я должен попробовать? (Я предпочел бы избегать просто бросать деньги на проблему со случайными идеями, которые не имеют под собой оснований!)

1) возможно, у ЦПУ нет некоторых «расширений» для набора команд (я вспоминаю годы go некоторые Процессоры получают расширения MMX "), поэтому процессор быстро обрабатывает мирские вычисления, но затягивает кодирование видео.

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

3) возможно, тот факт, что на этой новой машине установлена ​​одна карта памяти DDR4, означает, что я заставляю все операции чтения и записи памяти для вычисления в той же памяти, что и для экрана, и это слишком много (имеется в виду, что добавление дополнительной карты памяти может просто помочь?)

4) возможно, есть какая-то настройка b ios, которая позволит больше эффективное разделение видеопамяти?

5) мой любимый, возможно, есть лучшая компрессионная библиотека ry, что я мог бы использовать, чтобы получить снимок экрана приличного качества с гораздо меньшим использованием ЦП.

Следует также отметить, что я пробовал это с -threads 0, и загрузка ЦП колеблется между 100% и 200%; около 100%, когда экран установлен c, и увеличивается, когда я перемещаюсь windows и, в противном случае, создаю дополнительный вывод.

6) материнская плата утверждает, что в нее встроен какой-то аппаратный видеокодер. Я не обращал на это никакого внимания, поскольку предполагал, что это было сделано для того, чтобы взять вход HDMI и кодировать его, но, возможно, есть способ использовать это, если да, то какие библиотеки мне могут понадобиться, чтобы заставить ffmpeg делать это.

Правки:

  • Это готовый ffmpeg. Я, конечно, готов попробовать сам, если у меня есть представление о том, что мне следует делать по-другому.
  • Материнская плата утверждает, что имеет аппаратные кодеры, но я изо всех сил пытаюсь выяснить, что это такое (кажется, что это чип Intel под названием «UHD Graphics 605», но ничего, что я могу найти, не говорит о том, что ffmpeg может с этим работать)
  • командная строка сейчас была (без звука):

    ffmpeg  -video_size 1280x720   -f x11grab  -i ${DISPLAY}+100,100  -vcodec libx264  -f alsa -i pulse -acodec ac3 -threads 0  ./video$(date +%F-%H-%M-%S).mp4
    

Журнал от короткого сеанса записи:

ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --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-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[x11grab @ 0x561a723e5ac0] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, x11grab, from ':0+100,100':
  Duration: N/A, start: 1578693116.465807, bitrate: N/A
    Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1280x720, 29.97 fps, 1000k tbr, 1000k tbn, 1000k tbc
Unknown decoder 'libx264'
simon@studio:~$ ffmpeg  -video_size 1280x720   -f x11grab  -i ${DISPLAY}+100,100  -vcodec libx264 -threads 0  ./video$(date +%F-%H-%M-%S).mp4
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --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-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[x11grab @ 0x558225bc29a0] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, x11grab, from ':0+100,100':
  Duration: N/A, start: 1578693132.513351, bitrate: N/A
    Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1280x720, 29.97 fps, 1000k tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x558225bcd360] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x558225bcd360] profile High 4:4:4 Predictive, level 3.1, 4:4:4 8-bit
[libx264 @ 0x558225bcd360] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to './video2020-01-10-14-52-12.mp4':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv444p, 1280x720, q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc
    Metadata:
      encoder         : Lavc57.107.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Past duration 0.806847 too large     256kB time=00:00:00.43 bitrate=4835.3kbits/s dup=16 drop=0 speed=0.207x    
frame=  371 fps= 29 q=-1.0 Lsize=     639kB time=00:00:12.27 bitrate= 426.6kbits/s dup=16 drop=14 speed=0.971x    
video:634kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.813096%
[libx264 @ 0x558225bcd360] frame I:2     Avg QP:18.16  size:221502
[libx264 @ 0x558225bcd360] frame P:93    Avg QP:14.97  size:  2007
[libx264 @ 0x558225bcd360] frame B:276   Avg QP:20.13  size:    69
[libx264 @ 0x558225bcd360] consecutive B-frames:  0.8%  0.0%  0.0% 99.2%
[libx264 @ 0x558225bcd360] mb I  I16..4: 44.6%  0.0% 55.4%
[libx264 @ 0x558225bcd360] mb P  I16..4:  0.2%  0.0%  0.3%  P16..4:  0.7%  0.1%  0.1%  0.0%  0.0%    skip:98.5%
[libx264 @ 0x558225bcd360] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  1.0%  0.0%  0.0%  direct: 0.0%  skip:99.0%  L0:50.9% L1:49.0% BI: 0.1%
[libx264 @ 0x558225bcd360] coded y,u,v intra: 41.3% 37.5% 37.4% inter: 0.1% 0.0% 0.0%
[libx264 @ 0x558225bcd360] i16 v,h,dc,p: 58% 41%  1%  0%
[libx264 @ 0x558225bcd360] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 33% 30% 14%  2%  4%  4%  5%  3%  5%
[libx264 @ 0x558225bcd360] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x558225bcd360] ref P L0: 59.2%  8.8% 25.5%  6.5%
[libx264 @ 0x558225bcd360] ref B L0: 59.4% 39.0%  1.6%
[libx264 @ 0x558225bcd360] ref B L1: 96.5%  3.5%
[libx264 @ 0x558225bcd360] kb/s:419.29
Exiting normally, received signal 2.
...