비디오 녹화시 ffmpeg로 CPU / 메모리 사용을 최소화하는 방법


13

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에 사용할 매개 변수는 무엇입니까?

답변:


17

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 기반 플레이어에서만 재생하는 경우에는이를 생략 할 수 있습니다.

참조


기본 디스플레이가 아닌 디스플레이 (Xvfb)에서 비디오를 캡처하므로 아무 숫자 나 될 수 있습니다.
Andrei Botalov

@AndreyBotalov 당신은 무손실 방법을 시도 했습니까? 당신을 위해 더 나은 성능을 했습니까?
llogan

1
현재 매개 변수를 사용 하여 호출 ffmpeg했습니다 -preset superfast(시도하지 않았습니다 -crf). 이 경우 리소스를 덜 사용하고 충분한 크기의 비디오를 제작합니다.
Andrei Botalov

@AndreyBotalov -crf 23는 값을 선언하지 않으면 기본적으로 사용되지만 어쨌든 superfast충분하면 문제가 해결 될 수 있습니다.
llogan

1
h264_nvenc (nvidia) 또는 h264_qsv (현대 인텔 CPU)를 통해 하드웨어 인코딩을 시도 할 수도 있습니다. 이렇게하면 인코딩 부담이 CPU에서 전용 h264 하드웨어로 전환됩니다.
Kenn

4

적은 리소스를 사용하는 방식으로 동일한 결과를 얻을 수있는 다른 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에 대한 지식을 사용 하면 프로세스 스왑 성 을 제어하는 것과 같은 많은 재미있는 작업을 수행 할 수 있습니다 .


2
ffmpeg를 우선 순위가 낮은 대기열에 올바르게 넣으면 바람직하지 않은 지연 시간이있는 비디오가 생성됩니다.
Andrei Botalov

1
흠 ... 온라인에서 아무 말도하지 않습니다. 그렇지 않은 경우 버그 여야합니다.
Richard

2
우선 순위를 올바르게 이해하면 ffmpeg의 프로세서 시간이 현재보다 줄어 듭니다. 제가 생각하기 때문에 그러나 프로세서는 거의 100 %로드됩니다 reprioritization하지 않습니다 도움
안드레이 Botalov

1
이는 프로세스의 CPU 사용량을 제한하도록 설계되었으므로 CPU가 100 %로 실행되면 CPU를보다 쉽게 ​​처리 할 수 ​​있습니다.
Richard

4
우선 순위를 어떻게 바꾸든 관계없이 우선 순위가 더 나 빠지기 때문에 -1이 있습니다. 우선 순위를 낮게 설정하면 ffmpeg의 CPU 시간이 줄어들어 프레임이 더 많이 떨어지거나 우선 순위를 높이면 시스템의 다른 프로세스 속도가 훨씬 느려집니다. 두 결과 모두 바람직하지 않습니다.
gertvdijk

0

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


x11grab와 같은 "실제 그랩 장치와 함께 사용할 수 없습니다".
llogan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.