Twitch는 이에 관한 게시물을 가지고 있습니다. 그들은 여러 가지 이유로 자신의 프로그램을 사용하기로 결정했다고 설명합니다. 그중 하나는 ffmpeg를 사용하면 다른 스레드에서 다른 x264 인스턴스를 실행할 수 없지만 대신 다음 출력으로 이동하기 전에 지정된 모든 스레드를 한 출력의 한 프레임에 할당합니다.
실시간 스트리밍을하지 않으면 더 고급스러워집니다. '올바른'방법은 -g로 지정된 GOP 크기만으로 한 해상도에서 인코딩 한 다음 같은 위치에서 키 프레임을 강제하는 다른 해상도를 인코딩하는 것입니다.
그렇게하려면 ffprobe를 사용하여 키 프레임 시간을 얻은 다음 셸 스크립트 또는 실제 프로그래밍 언어를 사용하여 ffmpeg 명령으로 변환 할 수 있습니다.
그러나 대부분의 콘텐츠의 경우 5 초마다 하나의 키 프레임과 5 초마다 2 개의 키 프레임을 갖는 것 (하나는 강제 및 하나는 장면 컷에서) 사이에 차이가 거의 없습니다. 이것은 평균 I- 프레임 크기와 P- 프레임 및 B- 프레임의 크기에 관한 것입니다. 일반적인 설정으로 x264를 사용하는 경우 (이에 영향을 미치는 모든 조치는 x264를 사용하여 쉬운 콘텐츠에서 비트 전송률을 사용하지 못하게하는 나쁜 방법으로 -qmin을 설정하는 것입니다. 모든 프레임 유형을 동일한 값으로 제한합니다) 생각합니다) I- 프레임 평균 크기 46kB, P- 프레임 24kB, B- 프레임 17kB (P- 프레임의 절반) 및 30fps에서 1 초마다 추가 I- 프레임과 같은 결과를 얻습니다. 파일 크기가 3 % 만 증가합니다. h264와 h263의 차이는 3 % 감소로 구성 될 수 있지만 단일 항목은 그다지 중요하지 않습니다.
다른 유형의 컨텐츠에서는 프레임 크기가 다릅니다. 공평하게 말하면 이것은 공간적 복잡성이 아니라 시간적 복잡성에 관한 것이므로 콘텐츠와 하드 콘텐츠가 쉬운 것은 아닙니다. 그러나 일반적으로 스트리밍 비디오 사이트에는 비트 전송률 제한이 있으며 비교적 큰 I- 프레임이있는 콘텐츠는 추가 된 키 프레임 수에 관계없이 고품질로 인코딩되는 쉬운 콘텐츠입니다. 낭비이지만이 폐기물은 일반적으로 눈에 띄지 않습니다. 가장 낭비되는 사례는 아마도 노래와 함께 제공되는 정적 이미지 일 뿐이고 각 키 프레임이 정확히 동일한 비디오 일 것입니다.
확실하지 않은 한 가지는 강제 키 프레임이 -maxrate 및 -bufsize로 설정된 속도 제한 기와 상호 작용하는 방식입니다. YouTube에서도 최근에도 일관된 품질을 제공하기 위해 버퍼 설정을 올바르게 구성하는 데 문제가 있다고 생각합니다. 일부 사이트에서 볼 수 있듯이 평균 비트 전송률 설정을 사용하는 경우 (16 진수 편집기로 헤더 / mov atom에서 x264의 옵션을 검사 할 수 있기 때문에) 버퍼 모델은 문제가되지 않지만 사용자 생성 콘텐츠를 제공하는 평균 비트 전송률은 사용자가 동영상 끝에 검은 색 화면을 추가하도록 권장합니다.
Ffmpeg의 -g 옵션 또는 사용하는 다른 인코더 옵션은 인코더 별 옵션에 매핑됩니다. 따라서 '-x264-params keyint = GOPSIZE'는 '-g GOPSIZE'와 같습니다.
장면 감지를 사용할 때의 한 가지 문제는 어떤 이유로 든 특정 숫자 근처의 키 프레임을 선호하는 경우입니다. 5 초마다 키 프레임을 지정하고 장면 감지를 사용하고 4.5에서 장면이 변경되면 감지해야하지만 다음 키 프레임은 9.5입니다. 시간이 계속 이렇게 높아지면 40, 45, 50, 55 대신 42.5, 47.5, 52.5 등의 키 프레임으로 끝날 수 있습니다. 반대로 5.5에서 장면이 변경되면 5.5가됩니다. 5와 5.5의 키 프레임은 다른 키 프레임에 비해 너무 빠릅니다. Ffmpeg에서는 "다음 30 프레임 내에 장면이 변경되지 않으면 여기에서 키 프레임을 작성하십시오"를 지정할 수 없습니다. C를 이해하는 사람은 그 옵션을 추가 할 수 있습니다.
가변 프레임 속도 비디오의 경우 Twitch와 같은 라이브 스트리밍이 아닌 경우 영구적으로 일정한 프레임 속도로 변환하지 않고 장면 변경을 사용할 수 있어야합니다. ffmpeg에서 'select'필터를 사용하고 표현식에서 'scene'상수를 사용하면 디버그 출력 (-v 디버그 또는 인코딩 중에 '+'를 여러 번 누름)이 장면 변경 번호를 표시합니다. 이것은 아마도 x264가 사용하는 숫자와 다르고 유용하지는 않지만 여전히 유용 할 수 있습니다.
따라서이 절차는 아마도 키 프레임 변경만을위한 테스트 비디오를 수행하는 것이지만 2- 패스를 사용하는 경우 속도 제어 데이터에 사용될 수 있습니다. 일정한 프레임 속도 비디오로 변환 (생성 된 데이터는 서로 다른 해상도 및 설정에 대한 모든 유용한에 있는지 확실하지. 매크로 블록 트리 데이터는되지 않습니다)하지만 볼 이 버그를 당신이 이제까지 결정하는 경우 프레임 속도를 절반으로 할 때 출력을 망가에 대해 다른 목적으로 fps 필터를 사용합니다. 원하는 키 프레임 및 GOP 설정으로 x264를 통해 실행하십시오.
그런 다음이 키 프레임 시간을 원래 가변 프레임 속도 비디오와 함께 사용하십시오.
프레임간에 20 초 간격으로 완전히 미친 사용자 생성 콘텐츠를 허용하는 경우 가변 프레임 속도 인코딩의 경우 출력을 분할하고 fps 필터를 사용하고 어떻게 든 select 필터를 사용할 수 있습니다. ffmpeg 옵션이 작동하는 경우 테스트 비디오를 입력으로 사용하고 키 프레임 만 디코딩하거나 선택 필터를 사용하여 키 프레임을 선택할 수 있습니다. 그런 다음 올바른 크기로 조정하고 (이 경우 scale2ref 필터도 있음) 원본 비디오를 오버레이하십시오. 그런 다음 인터리브 필터를 사용하여 이러한 예정된 강제 키 프레임을 원본 비디오와 결합하십시오. 인터리브 필터로 방지 할 수없는 0.001 초 간격의 두 프레임이 발생하는 경우 다른 선택 필터를 사용하여이 문제를 직접 해결하십시오. 인터리브 필터에 대한 프레임 버퍼 한계를 다루는 것이 주요 문제가 될 수 있습니다. 이것들은 모두 작동 할 수 있습니다 : 어떤 종류의 필터를 사용하여 밀도가 높은 스트림을 버퍼링하십시오 (오 필터)? 입력 파일을 여러 번 참조하여 파일이 두 번 이상 디코딩되고 프레임을 저장할 필요가 없습니다. 정확히 키 프레임 시간에 내가 한 적이없는 'streamselect'필터를 사용하십시오. 기본 동작을 변경하거나 프레임을 삭제하는 대신 버퍼에서 가장 오래된 프레임을 출력하는 옵션을 추가하여 인터리브 필터를 개선하십시오. 정확히 키 프레임의 시간에 내가 한 적이 없습니다. 기본 동작을 변경하거나 프레임을 삭제하는 대신 버퍼에서 가장 오래된 프레임을 출력하는 옵션을 추가하여 인터리브 필터를 개선하십시오. 정확히 키 프레임의 시간에 내가 한 적이 없습니다. 기본 동작을 변경하거나 프레임을 삭제하는 대신 버퍼에서 가장 오래된 프레임을 출력하는 옵션을 추가하여 인터리브 필터를 개선하십시오.