FFmpeg 인코딩을 일시 중지하고 다시 시작하는 방법이 있습니까?


14

나는 매일 몇 시간 분량의 비디오 영상을 녹화했으며,이를 사용하여 인코딩을 위해 대기열에 설정했습니다 ffmpeg. veryslow와 함께 사전 설정을 사용 x265하므로 한 시간 분량의 비디오를 인코딩하는 데 최대 20 시간 이상이 걸릴 수 있습니다.

컴퓨터가 밤낮으로 작동하기 때문에 인코딩 ffmpeg일시 중지하고 다시 시작할 수 있는 방법이 있는지 궁금합니다 . TerminalOS X에 사용 하고 있습니다.

그렇다면 터미널을 종료하고 컴퓨터를 재부팅 한 후에도 인코딩을 계속할 수 있습니까? OS X에 다시 로그인하면 터미널 세션이 복원된다고 생각합니다. 최소한 터미널 기록입니다.

답변:


14

매달다

간단한 방법은 ctrl+ 로 일시 중단하는 것입니다 z. 또는 PID pgrep ffmpeg를 사용 kill -s SIGSTOP <PID>하여 일시 중지 하는 데 사용할 수 있습니다.

그런 다음 fg또는 명령으로 다시 시작하십시오 kill -s SIGCONT <PID>.

불행히도 이것은 재부팅 후에도 지속되지 않습니다.

VM

VirtualBox와 같은 가상 머신을 사용하는 경우 게스트 VM에서 인코딩을 수행 할 수 있습니다. 재부팅해도 여전히 "시스템 상태 저장"이 가능합니다. 또한 게스트에 최대 CPU 리소스를 할당하여 호스트가 항상 사용 가능한 리소스를 갖도록 할 수 있습니다.

아마도 과잉이지만 VM에 익숙하거나 이미 사용하고 있다면 가능한 해결책 일 것입니다.


그러나 이미 VM 솔루션을 사용하지 않는 한 VM 솔루션이 매우 번거 롭습니다.
user24601

VirtualBox 방식이 작동하지 않았습니다. 상태를 중간 인코딩으로 저장하려고 시도하고 [Ctrl] + [z]로 일시 중단 한 다음 상태를 저장하려고했습니다. 상태를 복원하고 다시 시작하려고 ffmpeg하면 오류 ( decode_band_types: Input buffer exhausted before END element found또는 Invalid NAL unit sizeError writing trailer/ Protocol error) 와 함께 중지됩니다 . 어쩌면 그것은 시간의 점프와 관련이 있습니다.
Jānis Elmeris

@ JānisElmeris 나는 그 문제를 복제 할 수없는 것 같습니다. 우분투 18.04 VM에서 시도해 보았습니다.
llogan

좋아, 아마 운이 좋지 않을 것이다. :) 새로운 Linux Mint 19.1 (Ubuntu 18.04 기반) VirtualBox VM으로 시도했습니다.
Jānis Elmeris

내 ffmpeg에는 많은 thred와 많은 PID가 있습니다. 각각을 SIGSTOP하고 SIGCONT해야합니까? 시기 적절한 제약이 있습니까?
wuppi

11

Windows에서 "일시 정지 / 중단"키 (가장 오른쪽 상단 키)를 누르면 일시 정지됩니다. 다시 입력하십시오.

작동하지 않으면 명령 프롬프트 창을 클릭하여 초점을 지정하십시오.


이것은 Windows에 가장 쉽고 가장 적합한 답변입니다 (Windows 10에서 확인).
lidsinker

1
이렇게하면 CPU가 완전히 해제되지만 램에 여전히 병목 현상이 발생합니다. 내 경우에는 8GB 램이 있으며 작업이 일시 중지되는 동안 거의 모든 램을 사용하고 있습니다. 그 어떤 수정? 이것을 hdd 또는 다른 것으로 전송할 수 있습니까? 나는 일시 중지하지 않을 때 일이 시작될 때 약간의 와인드업을 신경 쓰지 않습니다.
kite

10

2015 년 9 월 30 일 현재 불가능한 것 같습니다 . 소스 파일을 세그먼트 화하고 세그먼트를 인코딩 한 다음 결과 파일을 스티칭하는 것이 좋습니다.

이것은 진정한 일시 중지 / 재개 기능은 아니지만 단편 분할을 사용하면 인코딩을 중단 할 수 있습니다.

실행할 명령에 대한 대략적인 개요 :

전체 파일을 부분으로 나누기

ffmpeg -i recording.mp4 -c copy -flags +global_header -segment_time n -f segment file%03d.mp4

file000.mp4, file001.mp4 등을 작성해야합니다. 세그 먼터 작동 방식 (I- 프레임에서만 잘라 내기)으로 인해이 파일의 n길이는 정확히 1 초가 아니고 비디오 부분이 제대로 재생되지 않을 수 있지만 데이터가 모두 존재하므로 각 부분을 변환 할 수 있습니다.

ffmpeg -i file001.mp4 -{filter/encoding parameters} -fflags +genpts file001-new.mp4

인코딩 된 부분 재결합

텍스트 파일을 생성하고 다음과 같이 렌더링 된 각 파일의 이름을 입력하십시오

file 'file000-new.mp4'
file 'file001-new.mp4'
.... 
file 'filelast-new.mp4'

그리고 달려

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4

6GB 메모리와 x264에서 x265로 encode하기 위해 12h의 예상 시간이 있고 중단 없음 (데스크톱)이 없어 VM 트릭을 사용할 수는 없지만 훌륭합니다. 나는 재결합 단계가 빠르다고 기대하지만 인코딩이 없기 때문에 그렇게 될 것이라고 생각합니다. 그것을 시도해야합니다, thx vm!
물병 자리 힘

"스트림 0의 코덱은 글로벌 헤더를 사용하지 않지만 컨테이너 형식에는 글로벌 헤더가 필요합니다"라는 경고가 표시되지만 최종 결과는 유용한 비디오입니다. 전혀 문제가 없습니다.
Aquarius Power

4

일시 중지하는 대신 일시 중지하면 인코딩 프로세스에 최소 시스템 우선 순위 (일명 " renice ")를 부여하므로 매일 편안하게 작업 할 수 있으며 사용하지 않는 시스템 리소스와 함께 백그라운드에서 인코딩이 수행됩니다. 따라서 인코딩은 주간 작업과 충돌하지 않고 중단없이 연중 무휴로 원활하게 수행됩니다.

AFAIK OSX에 pidof 명령이 없으므로 ffmpeg 프로세스 번호 (PID) 를 알아야합니다.

그런 다음 프로세스를 유휴 상태로 되돌릴 수 있습니다.

sudo renice 20 yourPID

필요한 경우 더 적극적인 포 그라운드 우선 순위로 프로세스를 취소 할 수도 있습니다.

sudo renice -10 yourPID

안녕하세요! 좋은 제안. 시도해야합니다.
Winterflags

4

스레드 일시 중단은 Windows가 아닌 ctrl+ 에서도 작동 Z하지만 리소스 관리자에서는 다시 시작할 수도 있습니다.


1

(Linux 용)

모두 알고 있듯이 'q'를 누르면 기록 파일이 종료됩니다.

ffplay에는 'p'가능성이 있습니다. ffmpeg에는 왜 같은 것이 없습니까? 어쩌면 비디오와 오디오가 비 동기화 될 수 있기 때문에?

나는 crf (23)를 사용하여 x264-aac-mkv로 ffmpeg-encode하고 항상 동일한 비디오 조건으로 녹화를 'quit'(q) 하고이 스크립트가있는 특정 디렉토리의 모든 세그먼트를 1 파일로 결합합니다. 이 bash 스크립트를 사용하여 스트림 복사 모드에서 :

#!/bin/bash

# FFMPEG MERGE

# File path must be absolutely absolute...

ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" /home/me/Videos/FFmpeg/FFmpeg_Merge/*.mkv) -c copy merged.mkv

exit 

그 후 결과 병합 된 비디오를 확인하여 다른 디렉토리에 붙여 넣습니다. 세그먼트는 병합 디렉토리에서 제거됩니다.

그러나 번거롭지 않은 'Pause & Resume'버튼은 실제로 환영받을 것입니다.)


0

이것은 아이디어 일 뿐이지 만 예산이 충분하다면 프로세서 (8 세대 Intel) 또는 비디오 카드 (NVIDIA GTX 1050 이상)로 업그레이드하여 인코딩 할 수 있습니다. CPU를 많이 사용하는 대신 하드웨어 가속 기능이있는 h.265 / HEVC x265. 비디오 인코딩은 20 시간 이내에 완료되어 전기 비용도 절약됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.