위키 작성 #47
완료됨BBPlayer 버그 수정 및 개선
설명
완료된 기능 구현 및 버그 수정¶
1. 뒤로가기 시 영상 재생 멈추지 않는 버그 수정¶
- 증상: 뒤로가기 후 영상이 백그라운드에서 계속 재생됨
- 원인: _saveAndPop()에 pause 없이 화면만 닫음
- 수정:
- _saveAndPop()에 await _player.pause() 추가 (내비게이션 전 정지)
- dispose()에 _player.stop() 추가
- didChangeAppLifecycleState() 백그라운드 진입 시 _player.pause() 추가
2. Synology 파일매니저 SMI 자막 자동 로딩 지원¶
- 증상: 시놀로지 QuickConnect URL(https://)로 열면 자막 자동 로딩 실패
- 원인: _autoLoadSubtitleForPath()가 파일 경로 기준으로만 동작, HTTPS URL 미처리
- 수정 (player_screen.dart):
- HTTPS/HTTP URL 분기 추가 → _autoLoadSubtitleFromUrl() 구현
- _buildSiblingUrl(): URL 경로 + hex 인코딩된 dlink 파라미터의 확장자를 함께 교체
- content:// URI 분기 추가 — Kotlin MethodChannel(findSiblingSubtitleUri, readContentUriBytes) 호출
- 수정 (MainActivity.kt):
- findSiblingSubtitleUri: 형제 content:// URI 접근 가능 여부 테스트
- readContentUriBytes: content:// URI 바이트 읽기
- resolveUri() 강화: MediaStore _DATA 컬럼 → /proc/self/fd 심볼릭 링크 2단계 경로 해석
- 수정 (subtitle_service.dart):
- convertSmiToSrtFromBytes(): 바이트 배열로 SMI→SRT 변환 (content:// URI 대응)
- saveTempSubtitle(): 임의 자막 바이트를 임시 파일로 저장
3. 음량 정규화 기능 구현¶
- 내용: 영상마다 다른 음량을 목표 dB로 자동 정규화 (on/off 토글 + 목표 dB 선택)
- 구현 방식: libmpv af 속성에 dynaudnorm 필터 주입 (Windows/Android 공통)
- dB → linear 변환: p = pow(10, db/20)
- 주요 변경 (player_screen.dart):
- 상태 변수 추가: _normalizationEnabled, _normTargetDb, _showNormPanel
- _applyAudioFilters(): scaletempo(속도)와 dynaudnorm(정규화)를 합쳐서 af 속성에 적용
- _setPlaybackSpeed(): _player.setRate() 대신 _applyAudioFilters() 사용 (af 충돌 방지)
- _loadNormSettings() / _saveNormSettings(): DB 키 norm_enabled, norm_target_db로 설정 영속 저장
- 정규화 패널 UI: Switch + 프리셋 버튼 (-23 dB 방송 / -14 dB YouTube / -6 dB / -3 dB)
- 컨트롤 바(세로/가로 모드)에 graphic_eq 아이콘 버튼 추가
4. 패널 클릭스루 버그 수정¶
- 증상: 패널(음량 정규화, 재생 속도 등) 터치 시 뒤의 영상이 정지/재생됨
- 원인: _buildControls()가 전체 화면 Container로 패널보다 Stack 상위에 위치하여 터치 이벤트를 가로챔
- 수정:
- _onTap(): 패널 열림 상태(_showSpeedPanel, _showNormPanel, _showAudioTrackPanel, _showSubtitleStylePanel, _showShortcutHelp)이면 early return
- 컨트롤 오버레이(AnimatedOpacity)를 IgnorePointer로 감싸고, 패널 열림 시 ignoring: true 적용
5. Video 위젯 기본 컨트롤 제거¶
- 증상: media_kit Video 위젯의 내장 컨트롤(빨간 progress bar)이 패널 열릴 때 노출됨
- 수정: Video 위젯에 controls: NoVideoControls 추가
버그 수정 요약¶
| # | 증상 | 원인 | 해결 |
|---|---|---|---|
| 1 | 뒤로가기 후 영상 계속 재생 | _saveAndPop() pause 없음 |
pause/stop 추가 |
| 2 | HTTPS URL 자막 자동 로딩 실패 | 파일 경로 기준 처리만 존재 | URL/content:// 분기 추가 |
| 3 | 속도·정규화 af 충돌 | 각각 af 속성 덮어쓰기 |
_applyAudioFilters()로 통합 |
| 4 | 패널 터치 시 영상 정지/재생 | 컨트롤 오버레이가 터치 가로챔 | IgnorePointer + _onTap early return |
| 5 | 패널 버튼 동작 안 함 | GestureDetector(onTap:(){}) 래퍼가 자식 이벤트 흡수 |
래퍼 제거, _onTap 조건으로 대체 |
| 6 | 패널 열릴 때 빨간 progress bar 출현 | Video 위젯 기본 컨트롤 활성화 상태 |
NoVideoControls 적용 |
변경된 파일 목록¶
| 파일 | 변경 내용 |
|---|---|
lib/screens/player_screen.dart |
뒤로가기 수정, HTTPS 자막, 음량 정규화, 패널 클릭스루, NoVideoControls |
lib/services/subtitle_service.dart |
convertSmiToSrtFromBytes, saveTempSubtitle 추가 |
android/app/src/main/kotlin/.../MainActivity.kt |
URI 해석 강화, content:// 자막 처리 추가 |