프로젝트

일반

사용자정보

Actions

위키 작성 #47

완료됨

BBPlayer 버그 수정 및 개선

이태훈이(가) 25일 전에 추가함. 25일 전에 수정됨.

상태:
완료
우선순위:
보통
담당자:
시작시간:
2026/04/01
완료기한:
2026/04/01

설명

완료된 기능 구현 및 버그 수정

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:// 자막 처리 추가
Actions

내보내기 Atom PDF