Xvfb 디스플레이에서 비디오 화면을 캡처하는 데 FFmpeg를 사용합니다.
현재 다음과 같이 호출합니다.
ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov
약 5 개의 Xvfb 세션에서 비디오를 녹화 할 때 CPU 사용량이 매우 높고 그로 인해 지연이 발생합니다. 또한 메모리 사용량은 각 ffmpeg 프로세스에 대해 약 300MB입니다.
비디오 화면 캡처를 할 때 컴퓨터 리소스 사용량 (특히 CPU 및 메모리)을 최소화하기 위해 ffmpeg에 사용할 매개 변수는 무엇입니까?
답변
1. 무손실 RGB 출력을 먼저 만드십시오
ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
-
입력은 RGB이므로 인코더 libx264rgb를 사용하면 일반 libx264를 사용할 경우 발생할 수있는 RGB에서 YUV 로의 느린 변환을 피할 수 있습니다.
-
가장 빠른 x264 인코딩 사전 설정 인 초고속을 사용합니다.
-
-crf 0
사용 되므로 출력이 손실되지 않습니다.
2. 그런 다음 다시 인코딩하십시오.
첫 번째 명령의 출력은 막대하며 대부분의 멍청한 플레이어는 RGB H.264를 처리 할 수 없으므로 다시 인코딩 할 수 있습니다.
ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
-
-crf
값을 실험하여 출력 품질을 제어 할 수 있습니다 . 주관적으로 제정 한 범위는 18-28이며, 여기서 18은 시각적으로 손실이 없거나 거의 없습니다. 기본값은 23입니다. -
당신이 인내심을 가지고 가장 느린 사전 설정을 사용하여 :
ultrafast
,superfast
,veryfast
,faster
,fast
,medium
,slow
,slower
,veryslow
. 기본값은medium
입니다. -
-vf format=yuv420p
QuickTime 및 Windows Media Player와 같은 벙어리 플레이어에서 출력이 작동하도록 추가 했습니다. YouTube에 업로드하거나 VLC, mpv, MPlayer 또는 기타 FFmpeg 기반 플레이어에서만 재생하는 경우에는이를 생략 할 수 있습니다.
참조
답변
적은 리소스를 사용하는 방식으로 동일한 결과를 얻을 수있는 다른 ffmpeg 옵션 사용에 집중하는 것이 좋습니다. 즉, ffmpeg로 특정 작업을 수행해야하고 너무 많은 리소스를 사용하는 경우 적은 리소스를 사용하는 방법이 있습니다.
ffmpeg
의 CPU 프로세스 우선 순위를 낮출 수 있습니다 .
- 터미널 방법 을 사용하는
nice
프로세스의 우선 순위를 변경하는 명령을 :nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov
. Linux에서 우선 순위 번호 (nice
명령 형식은nice -n <priority> <command>
)의 범위는 -20에서 20입니다. 정수가 클수록 우선 순위가 낮 습니다. neutral은 0입니다. 내가 제공 한 명령을 사용하고 8로 설정하면 CPU가 프로세스에 더 적은 시간을 주므로 “전력”이 줄어 듭니다. 물론이 숫자가 너무 높거나 낮 으면 변경할 수 있습니다. - GUI 방법 : 정확한 수를 덜 제어하고 프로세스가 시작 되 자마자 적용되지 않기 때문에 권장하지 않습니다. 그러나 더 이해하기 쉽습니다. 으로
ffmpeg
실행, 시스템 모니터를 엽니 다. 이라는 프로세스로 스크롤을 내리고ffmpeg
마우스 왼쪽 단추로 클릭하여 선택하고 마우스 오른쪽 단추로 클릭 한 다음 우선 순위를 “낮음”또는 “매우 낮음”으로 설정하십시오.
메모리 사용에 대해 걱정이되는 경우 프로세스에 너무 많은 메모리 만 사용하고 계속 실행하도록 지시 할 수는 없습니다. 커널은 프로세스의 메모리 할당을 자동으로 제어합니다. timeout
스크립트를 사용하여 프로세스를 케이지하는 방법이 있으므로 프로세스 및 하위 프로세스가 너무 많은 메모리 (사용자가 설정 한 한계)를 차지할 때 안전하게 종료되고 알림이 표시됩니다. 그러나 프로세스에 너무 많은 메모리가 제공되고 (예 : 커널에 의해) 더 많은 메모리를 요청하면 충돌이 발생합니다.
알아야 할 몇 가지 유용한 정보 :
- Cgroups- https: //www.kernel.org/doc/Documentation/cgroups/cgroups.txt
- 커널의 메모리 컨트롤러-https:
//www.kernel.org/doc/Documentation/cgroups/memory.txt
Cgroup에 대한 지식을 사용 하면 프로세스 스왑 성 을 제어하는 것과 같은 많은 재미있는 작업을 수행 할 수 있습니다 .
답변
-re (입력) 기본 프레임 속도로 입력을 읽습니다. 주로 횡령 장치 또는 라이브 입력 스트림을 시뮬레이션하는 데 사용됩니다 (예 : 파일을 읽을 때). 실제 그랩 장치 또는 라이브 입력 스트림 (패킷 손실을 일으킬 수있는)과 함께 사용해서는 안됩니다. 기본적으로 ffmpeg는 입력을 가능한 빨리 읽습니다. 이 옵션은 입력 읽기를 입력의 기본 프레임 속도로 느리게합니다. 실시간 출력 (예 : 라이브 스트리밍)에 유용합니다.