저는 시뮬레이션된 화면으로 작업 중인데 Xvfb
ffmpeg를 사용하여 캡처하고 싶습니다. 프레임 누락이나 중복을 방지하기 위해 화면의 정확한 주사율로 캡처하고 싶은데 Xvfb에는 없는 것 같은데... 이런 게 있나요?
xrandr
0.0인지 확인합니다.
$ Xvfb :123 -ac -nolisten tcp -screen 0 1920x1080x24 &
$ DISPLAY=:123 xrandr
xrandr: Failed to get size of gamma for output screen
Screen 0: minimum 1 x 1, current 1920 x 1080, maximum 1920 x 1080
screen connected 1920x1080+0+0 0mm x 0mm
1920x1080 0.00*
이미지는 어떤 속도로 화면에 그려지나요? ffmpeg는 다음 명령을 사용할 때 이 입력에 대해 29.97fps의 프레임 속도를 보여줍니다 x11grab
.
$ ffmpeg -f x11grab -i :123
ffmpeg version 4.3.5-0+deb11u1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
configuration: --prefix=/usr --extra-version=0+deb11u1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
[x11grab @ 0xaaaadaa0c2a0] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, x11grab, from ':123':
Duration: N/A, start: 1669816070.219332, bitrate: 1988667 kb/s
Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1920x1080, 1988667 kb/s, 29.97 fps, 1000k tbr, 1000k tbn, 1000k tbc
그러나 "기본" 프레임 속도를 사용하여 실시간으로 인코딩할 때 얻는 결과는 ~17-21fps에 가깝습니다.
$ ffmpeg -progress - -nostats -f x11grab -re -i :123 -f null /dev/null
…
frame=198
fps=17.80
stream_0_0_q=-0.0
bitrate=N/A
total_size=N/A
out_time_us=11111100
out_time_ms=11111100
out_time=00:00:11.111100
dup_frames=0
drop_frames=0
speed=0.999x
progress=end
제가 보기에는 모니터에 기본 프레임 속도가 없고 대신 마음대로 샘플링할 수 있는 것 같습니다.
그래서 내 질문은 이것이 맞습니까? 그렇다면 처리 능력이 충분히 큰 한 "무제한"fps를 달성할 수 있을까요?
답변1
프레임 속도는 영화 프로젝터에서 나옵니다. 상자 안에 이미지가 있고("프레임"), 화면에서 잠시 깜박인 후 공백이 되고, 또 다른 프레임이 잠시 깜박이고, 지속되는 시력으로 인해 다음과 같은 모습이 됩니다. 사진 속 물체를 움직입니다.
최초의 컴퓨터 그래픽 비디오 디스플레이는 벡터 드로잉에 오실로스코프를 사용했습니다. 오실로스코프 화면에는 정지 시간이 있으며, 그 시간을 초과하면 화면에 그려진 벡터 선이 천천히 사라집니다. 운전자는 밝기를 변경하기 위해 다양한 주파수와 속도로 다양한 선을 그리고 다시 그릴 수 있으므로 디스플레이의 일부 부분은 특정 간격으로 새로 고쳐지고 다른 부분은 다른 밝기에 대한 다른 간격과 속도로 새로 고쳐집니다. 이에 대한 특별한 프레임 속도는 없습니다.
나중에 그들은 "범위"의 동일한 전자 빔이 스크린을 스캔하는 래스터 스크린을 만들었지만 이제는 선이 왼쪽에서 오른쪽으로 배열된 다음 그 아래에 선이 순차적으로 또는 엇갈리게 배열되어 전자를 회전시키는 직사각형 패턴으로 만들어졌습니다. 흑백 이미지를 제공하기 위해 빔을 켜고 끄거나(또는 강도를 변경) 이미지가 2배 인터레이스된 경우 "절반 프레임" 속도를 가지며, 화면의 선 절반이 그려진 다음 나머지 절반이 그 사이에 그려집니다(동일한 절반 프레임의 다른 모든 선). 이 인터레이스된 절반 프레임 속도는 두 절반 프레임의 모션이 다르게 발생할 수 있으므로 정확히 프레임 속도로 변환되지 않습니다.
초기 TV에는 선이 있었지만 선 내의 시뮬레이션이므로 실제 픽셀이 없었지만 컴퓨터로 가져오면 선이 픽셀이 되고 비디오 카드에는 픽셀 속도와 새로 고침 빈도가 있었는데 새로 고침 빈도가 표시되는 데 시간이 얼마나 걸립니까? 위로. 두 개의 반 프레임을 그리는 중... 결국 보이는 것은 프레임 속도입니다. 특히 단일 필드와 동일한 시간 내에 두 필드의 내용을 그릴 수 있도록 더 높은 픽셀 속도를 얻은 다음 인터레이스에서 연속적인 프로그레시브 라인으로 이동할 수 있습니다.
그런 다음 우리는 튜브 디스플레이에서 LCD 디스플레이로 전환했습니다. 더 이상 형광체 유지 시간을 사용하지 않기 때문에 갑자기 더 이상 새로 고침 빈도가 없고 전자 빔이 없어 스캔 속도가 없습니다. 그러나 비디오 신호 형식 설계는 여전히 기존 픽셀 스캐닝 형식을 사용합니다. 그렇다면 LCD 모니터에는 프레임 속도가 있습니까? 일종의. 여기에는 연속적인 픽셀 스트림을 화면에 수용할 수 있는 최대 픽셀 속도가 있어 전체 화면이 업데이트되는 속도와 움직이는 객체가 업데이트되는 속도가 제한됩니다.
이제 픽셀을 수용하기 위해 의사 아날로그 신호가 더 이상 필요하지 않은 LCD 화면과 기타 형식이 있습니다. 이들은 압축 및 복잡한 명령이 포함된 전체 디지털 형식을 사용합니다. 따라서 화면 전체가 아닌 작은 영역만 새로 고치도록 지시할 수 있으며 이제 프레임 속도가 다시 사라집니다.
질문으로 돌아가서, Xvfb에는 프레임 속도가 있습니까? 하드웨어가 없는 완전한 가상 장치이므로 사물을 "표시"할 수 있는 속도를 제한하는 것은 없습니다. X11 프로토콜은 원시 픽셀 래스터 업데이트뿐만 아니라 전체 그리기 명령을 지원하므로 프레임 속도가 없습니다.
그럼 소스는 어떨까요? 이미지 소스가 보낼 수 있는 그리기 명령은 CPU 및 GPU의 속도에 의해서만 제한되므로 모든 프레임 속도는 해당 속도와 업데이트하려는 항목의 복잡성에 따라 달라질 수 있습니다.
따라서 일부 게임에는 장면이 부분적으로 그려지는 것을 보는 대신 전체 장면을 렌더링하고 전체 그림을 한 번에 제공하기 때문에 프레임 속도가 있으므로 일반적으로 버퍼를 두 배로 늘려 동시에 하나의 버퍼를 표시합니다. 버퍼. 숨겨진 버퍼에 그린 다음 교체합니다. 결과적으로 영화와 같은 프레임 속도가 생성됩니다. 게임은 하드웨어가 허용하는 한 빠르게 렌더링할 수 있지만, 이는 상당히 다를 수 있습니다. 많은 게임에서는 내부 게임 상태를 표시되는 내용과 동기화하기를 원할 수 있으므로 프레임 속도를 설정하고 하드웨어를 해당 속도로 인위적으로 제한합니다. (또는 하드웨어가 따라갈 수 없는 경우 프레임을 건너뛰고 더 낮지만 여전히 동기화된 프레임을 얻을 수 있습니다.)
Xvfb에는 기본 프레임 속도가 없습니다. 가능한 최대 프레임 속도를 갖습니다. 녹화 소프트웨어의 최대 프레임 속도는 이미지를 캡처하고 처리하고 디스크에 쓰는 파이프라인에 의해 제한될 수 있습니다.
이상적으로는 xvfb에서 힌트를 얻을 수 있고 변경이 이루어지고 완전히 그려진 후에만 프레임을 저장할 수 있지만 이는 프레임 속도가 아니며 가변 타이밍이 있는 프레임이 됩니다. 아니면 프레임 없이 일련의 그리기 명령을 저장하면 됩니다.
아마도 가변 타이밍이나 드로잉 프리미티브가 있는 프레임을 사용하는 대신 고정 프레임 속도로 녹화하는 비디오 코덱을 선택했기 때문에 프레임 속도가 필요할 것입니다.
가장 좋은 방법은 원하는 출력 파일 크기에 해당하는 임의의 프레임 속도를 선택하는 것입니다. 너무 느리지 않아서 불안정해 보이지는 않습니다.