iOS에서 Safari와 Firefox 모두에서 이 문제가 버그임을 확인했습니다. 여러 번 재생/일시정지를 해야만 오디오가 재생됩니다. 위젯 컴포넌트는 두 브라우저에서 모두 동일하게 보입니다(모바일 Firefox가 모바일 Safari 렌더링 엔진을 감싸는 래퍼일 뿐이라고 _생각_합니다). iOS 13.5.1에서 테스트했습니다.
이 w3schools 오디오 클립은 iOS Safari와 Firefox에서 정상적으로 재생됩니다. W3Schools Tryit Editor. 문제가 preload="none"를 사용했기 때문일 수도 있습니다. 제가 생각할 수 있는 유일한 차이점입니다… 또는 보안 미디어 URL을 실제 오디오 URL로 302 리다이렉트하는 것이 문제를 일으키는 것일까요?
지금까지 꽤 모험적인 과정이었네요. 결국에는 Ubuntu 기기의 Chrome과 iPhone의 iOS Safari 간 원격 디버깅을 설정하는 데 성공했지만, 그 과정은 험난했습니다. 그러나 안타깝게도 Network 탭이 비어 있는데, 이 경우 가장 중요한 부분이 바로 이 탭이라 좀 짜증스럽습니다.
preload="metadata"로 설정하면 iOS Safari에서 첫 번째 클릭 시 오디오가 재생되는 것을 확인했습니다. 반면 preload="none"으로 설정하면 실제로 오디오를 재생하려면 Play > Pause > Play 순서를 거쳐야 합니다.
아직 이 문제에 대해 고민하고 이것저것 시도해 보고 있습니다. 두 가지 모두를 만족시킬 수 있을지 확신이 서지 않습니다. 보안 미디어를 보기 위해 여러 번 클릭해야 하는 것은 이상적인 경험이 아닙니다.
수정: 디버거의 Network 탭을 작동시키는 데 성공했습니다. 내부 Discourse 인스턴스에서 preload="none"이 설정된 audio 태그에 대한 예시입니다:
재생 버튼 누름: GET /secure-media-uploads/meta/dev/original/4X/6/1/8/618a6b19a07de18205cc9889cb604e414b30372b.mp3 요청이 Finished 상태로 반환됩니다.
일시정지 버튼 누름.
재생 버튼 누름: GET presigned_url_here 요청이 206 Partial Content 상태로 반환되고, 오디오가 정상적으로 로드됩니다.
여기서 이상한 점은 preload="metadata"인 경우에도 동일한 요청 시퀀스가 발생한다는 것입니다. 단, 재생 클릭은 한 번만 하면 됩니다. Safari가 첫 번째 재생 클릭 시 메타데이터를 가져오고, 오디오를 재생하려면 다시 일시정지 후 재생을 해야 하는 것처럼 보입니다.
이것이 Android 등 다른 기기에서도 발생하는지 확신이 서지 않습니다. 해당 기기로 테스트할 장치가 없기 때문입니다.
이것이 mitmproxy를 설정하여 여기서 무슨 일이 일어나고 있는지 다시 살펴보는 계기가 되었습니다. 첫 번째 “Finished” 요청은 iOS 기기/사파리 브라우저에서 나가지 않는 것 같습니다. mitm 프록시는 PLAY를 두 번째로 클릭할 때까지 아무것도 기록하지 않습니다.
네, 그 방향으로 진행해야 할 것 같습니다. Android와 데스크톱 Safari에서도 테스트해 주셔서 감사합니다. 현재 preload 속성은 지원되지 않는 상태이므로, 브라우저가 Safari인지 감지하여 preload 속성을 대체하는 클라이언트 사이드 코드가 필요할 것 같습니다. 오늘 이 부분에 대해 몇 가지 실험을 해 보겠습니다.
네, 하지만 이 새로운 수정 사항으로 인해 미디어가 포함된 게시물이 화면에 표시될 때(예: 스크롤을 통해) preload 속성만 변경하면 이 문제를 우회할 수 있을 것 같습니다. 문제는 보안 미디어 URL에서 메타데이터를 가져온 후 서명된 URL이 생성되어 플레이어에 사용되는데, 이 URL은 5분 후에 만료된다는 점입니다. 따라서 5분 이내에 재생을 누르지 않으면 URL이 만료됩니다.
JS를 사용하여 미디어를 재생했다가 일시 정지하면, 나중에 전송되는 206 부분 콘텐츠 요청에 차이를 만들 수 있는지 궁금합니다. 서명된 URL의 만료에 구애받지 않는 것으로 보이는 요청이므로요. 물론 제 추측일 수 있으며, 더 많은 테스트가 필요합니다.
수정: Android 기기에 Chrome을 사용하여 직접 확인해 본 결과, 해당 기기에서는 이 문제가 발생하지 않는 것을 확인했습니다.