비디오 녹화시 ffmpeg로 CPU / 메모리 사용을 최소화하는 방법 x11grab -i :100 -vcodec libx264 /tmp/video.mov 약 5

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=yuv420pQuickTime 및 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스크립트를 사용하여 프로세스를 케이지하는 방법이 있으므로 프로세스 및 하위 프로세스가 너무 많은 메모리 (사용자가 설정 한 한계)를 차지할 때 안전하게 종료되고 알림이 표시됩니다. 그러나 프로세스에 너무 많은 메모리가 제공되고 (예 : 커널에 의해) 더 많은 메모리를 요청하면 충돌이 발생합니다.

알아야 할 몇 가지 유용한 정보 :

Cgroup에 대한 지식을 사용 하면 프로세스 스왑 성 을 제어하는 것과 같은 많은 재미있는 작업을 수행 할 수 있습니다 .


답변

-re (입력) 기본 프레임 속도로 입력을 읽습니다. 주로 횡령 장치 또는 라이브 입력 스트림을 시뮬레이션하는 데 사용됩니다 (예 : 파일을 읽을 때). 실제 그랩 장치 또는 라이브 입력 스트림 (패킷 손실을 일으킬 수있는)과 함께 사용해서는 안됩니다. 기본적으로 ffmpeg는 입력을 가능한 빨리 읽습니다. 이 옵션은 입력 읽기를 입력의 기본 프레임 속도로 느리게합니다. 실시간 출력 (예 : 라이브 스트리밍)에 유용합니다.


답변