Files
video-v1/vav2/todo6.txt

124 lines
3.9 KiB
Plaintext

● ⚠️ 프레임 스킵으로 인한 영상 끊김/깨짐 문제!
🔍 문제 원인:
1. AV1 프레임 의존성: P/B 프레임이 이전 프레임을 참조하는데 스킵으로 인해 참조 프레임 손실
2. 키프레임 스킵: I-프레임까지 스킵하면 전체 GOP가 깨짐
3. 디코드 에러 급증: errors=39.3% → 화면 깨짐 직접 원인
🎯 해결방안:
Option A: 키프레임 보호 스킵 (추천)
// I-프레임(키프레임)은 절대 스킵하지 않음
bool isKeyFrame = /* 프레임 타입 확인 */;
if (!isKeyFrame && shouldSkipFrame) {
// P/B 프레임만 스킵
}
Option B: 스킵 임계값 완화
// 더 보수적인 스킵
if (timingDelta > 0.15) { // 50ms → 150ms로 증가
shouldSkipFrame = true;
}
Option C: GOP 단위 스킵
// GOP(Group of Pictures) 전체를 스킵해서 깨짐 방지
if (shouldSkip) {
skipToNextKeyFrame(); // 다음 키프레임까지 스킵
}
Option D: 품질 저하 대신 스킵
// 프레임 스킵 대신 해상도/품질 동적 조정
if (timingDelta > 0.1) {
reduceQuality(); // 4K → 1080p 동적 변경
}
어떤 방식을 시도해보시겠습니까?
1. 키프레임 보호 스킵 (가장 안전)
2. 스킵 임계값 완화 (가장 간단)
● 동적 해상도 조정 구현 방안
3가지 접근 방법을 제안합니다:
옵션 A: GPU 렌더링 해상도 스케일링 ⭐ (권장)
현재 시스템에 가장 적합하고 구현이 용이합니다.
구현 방안:
// 뷰포트 크기에 따른 동적 해상도 조정
struct AdaptiveRenderingSettings {
uint32_t viewport_width, viewport_height;
uint32_t render_width, render_height; // 실제 렌더링 해상도
float quality_scale; // 0.25, 0.5, 0.75, 1.0
};
// 4개 플레이어 → 각각 25% 해상도로 렌더링
if (player_count == 4) {
settings.quality_scale = 0.5f; // 4K → 1080p
settings.render_width = original_width * 0.5f;
settings.render_height = original_height * 0.5f;
}
장점:
- SimpleGPURenderer에서 텍스처 크기만 조정하면 됨
- dav1d 디코더는 그대로 사용 (전체 해상도 디코딩)
- GPU 스케일링으로 고품질 다운샘플링
- 구현이 비교적 간단
성능 향상:
- GPU 메모리: 75% 절약 (4K → 1080p 텍스처)
- 렌더링 속도: 4배 향상
- 디코딩은 동일하지만 렌더링 부하 대폭 감소
옵션 B: dav1d 레이어 디코딩 🔬 (고급)
AV1의 Scalable Video Coding (SVC) 기능 활용
구현 방안:
// dav1d settings에서 spatial layer 제한
Dav1dSettings settings;
dav1d_default_settings(&settings);
settings.operating_point = 0; // Base layer만 디코딩
settings.all_layers = 0; // 상위 레이어 스킵
장점:
- 디코딩 단계에서부터 성능 향상
- 메모리 사용량 최소화
- 네트워크 대역폭도 절약 (SVC 스트림 시)
단점:
- 파일이 SVC로 인코딩되어야 함
- 기존 AV1 파일은 대부분 단일 레이어
옵션 C: 선택적 프레임 디코딩 ⚡ (성능 최적화)
해상도는 유지하되 디코딩 품질/속도 조정
구현 방안:
// dav1d에서 디코딩 스레드 수 동적 조정
if (player_count >= 4) {
settings.n_threads = 1; // 각 플레이어당 1스레드
} else {
settings.n_threads = 4; // 단일 플레이어는 4스레드
}
// 그레인 필터 비활성화로 성능 향상
settings.apply_grain = 0; // Film grain 효과 스킵
권장 구현 순서
1단계: GPU 렌더링 스케일링 (옵션 A)
- SimpleGPURenderer에서 텍스처 크기 동적 조정
- 즉시 75% 성능 향상 효과
2단계: 디코더 최적화 (옵션 C)
- 스레드 수 및 품질 옵션 동적 조정
- 추가 20-30% 성능 향상
이 방법이 프레임 스킵보다 훨씬 자연스럽고 효과적일 것 같습니다. 어떤 옵션부터 구현해보시겠습니까?