메모리 사용량을 줄이기 위해 프레임을 삭제하도록 ffmpeg에 지시하시겠습니까?

메모리 사용량을 줄이기 위해 프레임을 삭제하도록 ffmpeg에 지시하시겠습니까?

.NET을 사용하여 보안 카메라의 실시간 영상을 MJPEG에서 MPEG2로 트랜스코딩하고 있습니다 ffmpeg.

불행하게도 트랜스코딩을 수행하는 기계는 실제로 CPU 사용률을 100% 유지할 수는 없지만 "충분히 양호"하고 가끔 프레임이 떨어지는 것은 신경 쓰지 않습니다. 그러나 어떤 이유로 ffmpeg프레임이 삭제되지 않아 프로세스가 들어오는 프레임보다 뒤쳐지면서 메모리 사용량이 계속 증가하고 시스템에 메모리가 부족해지고 비디오가 심하게 손상되기 시작합니다.

ffmpeg좀 더 공격적으로 프레임을 떨어뜨리도록 지시할 수 있는 방법이 있나요 ? 메모리 사용량이 1.9GB에 도달하면 문제가 발생하므로 monit메모리가 1.5GB를 초과하면 프로세스를 다시 시작하려고 시도했지만 10분마다 다시 시작되어 각 트랜스코딩된 파일의 기본 길이인 15분을 초과했습니다.

이것은 내가 사용하는 명령입니다:

ffmpeg -overrun_nonfatal 1 -y -i udp://1.2.3.4
    -c mpeg2video -b:v 2M -vf transpose=2
    -preset ultrafast -an -r 30
    out.mkv

맨페이지에는 이 -r옵션을 출력 옵션으로 사용하여 프레임을 드롭할 수 있다고 되어 있지만, 제가 이렇게 하고 있는데 입력 스트림을 따라잡기 위해 프레임을 드롭하는 것이 아니라 출력 프레임 속도(여기서는 30fps)에 맞게 프레임만 드롭하는 것으로 보입니다.

-vsync옵션은 버퍼링을 최소화하는 대신 프레임 속도를 일치시키려는 비슷한 작업을 수행하는 것처럼 보입니다.

-frame_drop_threshold더 유망해 보이지만 이는 실시간 인코딩을 따라잡기보다는 타임스탬프를 따라잡기 위해 프레임을 삭제하는 것 같습니다.

ffmpeg너무 많은 메모리를 사용하지 않기 위해 필요에 따라 프레임을 삭제하도록 지시하는 다른 옵션이 있습니까 ? 나는 이것이 실시간/스트리밍/낮은 대기 시간 옵션에 있을 것이라고 생각하지만 아무것도 찾을 수 없는 것 같습니다!

답변1

저는 이것이 카메라에서 캡처하고 FULL HD를 스트리밍할 때 내 환경에 문제가 있다는 것을 발견했습니다. 네트워크에서 병목 현상이 발생하는 동안 ffmpeg rtbufsize는 꽤 빨리 채워지고 ffmpeg는 프레임을 떨어뜨리기 시작합니다. 이것이 귀하의 문제에 대한 해결책인 것 같습니다.

libavformat 라이브러리는 모든 muxers 및 demuxersock에 설정할 수 있는 몇 가지 일반적인 전역 옵션을 제공합니다.

rtbufsize정수(입력)

    실시간 프레임 버퍼링에 사용되는 최대 메모리를 설정합니다.

원천:FFmpeg 형식 문서

150MB의 제한된 버퍼를 원한다고 가정하면 다음을 시도해 보십시오.

ffmpeg -rtbufsize 150M -overrun_nonfatal 1 -y -i udp://1.2.3.4 -c mpeg2video -b:v 2M -vf transpose=2 -preset ultrafast -an -r 30 out.mkv

즉, 머신이 따라잡을 수 없는 동안 들어오는 데이터를 RAM에 채우기 시작하여 버퍼를 채우고, 한계에 도달하면 프레임이 크게 떨어지기 시작합니다.

관련 정보