<video> 및 <source> 태그

웹용으로 동영상 파일을 올바르게 준비했습니다. 올바른 크기와 해상도를 지정했습니다. 브라우저마다 별도의 WebM 및 MP4 파일을 만들었습니다.

다른 사용자가 동영상을 볼 수 있도록 하려면 웹페이지에 동영상을 추가해야 합니다. 이를 올바르게 하려면 두 가지 HTML 요소인 <video> 요소와 <source> 요소를 추가해야 합니다. 이 도움말에서는 이러한 태그에 관한 기본사항 외에도 우수한 사용자 환경을 만들기 위해 이러한 태그에 추가해야 하는 속성을 설명합니다.

단일 파일 지정

권장되지는 않지만 동영상 요소를 단독으로 사용할 수도 있습니다. 항상 아래와 같이 type 속성을 사용하세요. 브라우저는 이를 사용하여 제공된 동영상 파일을 재생할 수 있는지 확인합니다. 감지할 수 없는 경우 괄호로 묶인 텍스트가 표시됩니다.

<video src="chrome.webm" type="video/webm">
    <p>Your browser cannot play the provided video file.</p>
</video>

여러 파일 형식 지정

미디어 파일 기본사항에서 모든 브라우저가 동일한 동영상 형식을 지원하는 것은 아니라는 점을 기억하세요. <source> 요소를 사용하면 사용자의 브라우저가 형식 중 하나를 지원하지 않는 경우 여러 형식을 대체 형식으로 지정할 수 있습니다.

아래 예에서는 이 도움말의 뒷부분에서 예시로 사용되는 삽입된 동영상을 생성합니다.

<video controls>
  <source src="https://storage.googleapis.com/web-dev-assets/video-and-source-tags/chrome.webm" type="video/webm">
  <source src="https://storage.googleapis.com/web-dev-assets/video-and-source-tags/chrome.mp4" type="video/mp4">
  <p>Your browser cannot play the provided video file.</p>
</video>

Glitch에서 사용해 보기

type 속성은 선택사항이지만 항상 <source> 태그 이벤트에 추가해야 합니다. 이렇게 하면 브라우저가 재생할 수 있는 파일만 다운로드합니다.

이 접근 방식에는 특히 모바일에서 다른 HTML 또는 서버 측 스크립팅을 제공하는 것에 비해 몇 가지 장점이 있습니다.

  • 선호도 순으로 형식을 나열할 수 있습니다.
  • 클라이언트 측 전환은 지연 시간을 줄여주므로 한 번만 콘텐츠 가져오기를 요청할 수 있습니다.
  • 형식 선택을 브라우저에게 맡기는 것은 사용자 에이전트 감지와 함께 서버 측 지원 데이터베이스를 사용하는 것보다 더 간단하고 빠르고 안정적입니다.
  • 각 파일 소스의 유형을 지정하면 네트워크 성능이 개선됩니다. 브라우저는 형식을 '스니핑'하기 위해 동영상의 일부를 다운로드하지 않고도 동영상 소스를 선택할 수 있습니다.

이러한 문제는 대역폭과 지연 시간이 중요하고 사용자의 인내심이 제한적인 모바일 환경에서 특히 중요합니다. type 속성을 생략하면 지원되지 않는 유형의 소스가 여러 개 있는 경우 성능에 영향을 줄 수 있습니다.

몇 가지 방법으로 세부 정보를 살펴볼 수 있습니다. 웹에서 동영상 및 오디오가 작동하는 방식을 자세히 알아보려면 A Digital Media Primer for Geeks를 참고하세요. 또한 DevTools에서 원격 디버깅을 사용하여 유형 속성이 있는 네트워크 활동과 유형 속성이 없는 네트워크 활동을 비교할 수 있습니다.

시작 및 종료 시간 지정

대역폭을 절약하고 사이트의 반응성을 더 높여보세요. 미디어 프래그먼트를 사용하여 시작 및 종료 시간을 동영상 요소에 추가하세요.

미디어 프래그먼트를 사용하려면 미디어 URL에 #t=[start_time][,end_time]를 추가합니다. 예를 들어 5~10초의 동영상을 재생하려면 다음을 지정합니다.

<source src="video/chrome.webm#t=5,10" type="video/webm">

<hours>:<minutes>:<seconds>에서 시간을 지정할 수도 있습니다. 예를 들어 #t=00:01:05는 1분 5초에 동영상을 시작합니다. 동영상의 첫 1분만 재생하려면 #t=,00:01:00을 지정합니다.

이 기능을 사용하면 여러 파일을 인코딩하여 제공하지 않고도 동일한 동영상에서 여러 개의 뷰를 제공할 수 있습니다(DVD의 신호 지점과 유사).

이 기능이 작동하려면 서버가 범위 요청을 지원하고 해당 기능을 사용 설정해야 합니다. 대부분의 서버는 기본적으로 범위 요청을 사용 설정합니다. 일부 호스팅 서비스에서는 이 기능을 사용 중지하므로 사이트에서 프래그먼트를 사용할 때 범위 요청을 사용할 수 있는지 확인해야 합니다.

다행히 브라우저 개발자 도구에서 이 작업을 할 수 있습니다. 예를 들어 Chrome에서는 네트워크 패널에 있습니다. Accept-Ranges 헤더를 찾아 bytes라고 표시되는지 확인합니다. 이미지에서 이 헤더 주위에 빨간색 상자를 그렸습니다. 값으로 bytes가 표시되지 않으면 호스팅 업체에 문의해야 합니다.

Chrome DevTools 스크린샷: Accept-Ranges: bytes
Chrome DevTools 스크린샷: Accept-Ranges: bytes

포스터 이미지를 포함합니다.

video 요소에 포스터 속성을 추가하면 동영상을 다운로드하거나 재생을 시작하지 않고도 요소가 로드되는 즉시 콘텐츠를 짐작할 수 있습니다.

<video poster="poster.jpg" ...>
  …
</video>

또한 동영상 src가 깨지거나 제공된 동영상 형식이 지원되지 않는 경우, 포스터가 대안이 될 수도 있습니다. 포스터 이미지의 유일한 단점은 추가 파일 요청으로, 대역폭을 소비하고 렌더링이 필요하다는 점입니다. 자세한 내용은 이미지를 효율적으로 인코딩을 참고하세요.

금지사항
대체 포스터가 없으면 동영상이 손상된 것처럼 보입니다.
대체 포스터가 없으면 동영상이 손상된 것처럼 보입니다.
권장사항
대체 포스터는 첫 번째 프레임이 캡처된 것처럼 보이게 합니다.
대체 포스터는 첫 번째 프레임이 캡처된 것처럼 보이게 합니다.

동영상이 컨테이너를 오버플로하지 않도록 보장

동영상 요소가 뷰포트에 비해 너무 큰 경우 컨테이너를 오버플로할 수 있습니다. 그러면 사용자가 콘텐츠를 볼 수 없거나 컨트롤을 사용하지 못할 수 있습니다.

Android Chrome 스크린샷, 세로 모드: 스타일이 지정되지 않은 동영상 요소가 뷰포트를 오버플로합니다.
Android Chrome 스크린샷, 세로 모드: 스타일이 지정되지 않은 동영상 요소가 뷰포트를 오버플로합니다.
Android Chrome 스크린샷, 가로 모드: 스타일이 지정되지 않은 동영상 요소가 뷰포트를 오버플로합니다.
Android Chrome 스크린샷, 가로 모드: 스타일이 지정되지 않은 동영상 요소가 뷰포트를 오버플로합니다.

CSS를 사용하여 동영상 크기를 제어할 수 있습니다. CSS가 모든 요구사항을 충족하지 않는 경우 YouTube 및 기타 소스의 동영상에도 FitVids와 같은 JavaScript 라이브러리와 플러그인을 사용할 수 있습니다. 안타깝게도 이러한 리소스는 네트워크 페이로드 크기를 증가시켜 수익과 사용자 지갑에 부정적인 영향을 미칠 수 있습니다.

여기서 설명하는 것과 같은 간단한 용도의 경우 CSS 미디어 쿼리를 사용하여 뷰포트 크기에 따라 요소의 크기를 지정하세요. max-width: 100%가 기본값입니다.

iframe에 있는 미디어 콘텐츠의 경우(예: YouTube 동영상), 반응형 접근방식을 시도해 보세요(John Surdakowski의 제안과 유사).

CSS

.video-container {
    position: relative;
    padding-bottom: 56.25%;
    padding-top: 0;
    height: 0;
    overflow: hidden;
}

.video-container iframe,
.video-container object,
.video-container embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

HTML

<div class="video-container">
  <iframe
    src="//www.youtube.com/embed/l-BA9Ee2XuM"
    frameborder="0"
    width="560"
    height="315"
  ></iframe>
</div>

직접 해 보기

반응형 샘플응답하지 않는 버전과 비교합니다. 보시다시피 응답이 없는 버전은 만족스러운 사용자 환경이 아닙니다.

기기 방향

데스크톱 모니터나 노트북에서는 기기 방향이 문제가 되지 않지만, 휴대기기 및 태블릿용으로 웹페이지 디자인을 고려할 때는 기기 방향이 매우 중요합니다.

iPhone의 Safari에서는 세로 모드 방향과 가로 모드 방향이 훌륭하게 전환됩니다.

iPhone의 Safari에서 재생되는 동영상의 스크린샷, 세로 모드
iPhone의 Safari에서 재생되는 동영상의 스크린샷, 세로 모드
iPhone의 Safari에서 재생되는 동영상의 스크린샷, 가로 모드
iPhone의 Safari에서 재생되는 동영상의 스크린샷(가로 모드)

Android의 iPad 및 Chrome에서는 기기 방향이 문제가 될 수 있습니다. 예를 들어, 사용자설정 기능이 없다면 iPad에서 가로 모드 방향으로 재생되는 동영상은 다음과 같습니다.

iPad의 Safari에서 재생되는 동영상의 스크린샷, 가로 모드
iPad의 Safari에서 재생되는 동영상의 스크린샷, 가로 모드

CSS에서 동영상 width: 100% 또는 max-width: 100%를 설정하면 많은 기기 방향 레이아웃 문제를 해결할 수 있습니다.

자동재생

autoplay 속성은 브라우저가 동영상을 즉시 다운로드하여 재생할지 여부를 제어합니다. 정확한 작동 방식은 플랫폼과 브라우저에 따라 다릅니다.

  • Chrome: 데스크톱에서 시청하는지, 모바일 사용자가 사이트 또는 앱을 홈 화면에 추가했는지 등 여러 요인에 따라 달라집니다. 자세한 내용은 자동재생 권장사항을 참고하세요.

  • Firefox: 모든 동영상 및 사운드를 차단하지만 모든 사이트 또는 특정 사이트의 제한을 완화할 수 있습니다. 자세한 내용은 Firefox에서 미디어 자동재생 허용 또는 차단하기를 참고하세요.

  • Safari: 이전에는 사용자 동작이 필요했지만 최근 버전에서는 이 요구사항이 완화되었습니다. 자세한 내용은 iOS용 새로운 <동영상> 정책을 참고하세요.

자동 재생 기능이 가능한 플랫폼이라도 이 기능을 사용하는 것이 적절한지 여부를 고려해야 합니다.

  • 데이터 사용은 많은 비용이 들 수 있습니다.
  • 사용자가 원하기 전에 미디어를 재생하면 대역폭과 CPU 사용량이 증가하여 페이지 렌더링이 지연될 수 있습니다.
  • 동영상 또는 오디오 재생이 사용자에게 방해가 되는 경우가 있을 수 있습니다.

프리로드

preload 속성은 사전 로드할 정보나 콘텐츠의 크기를 브라우저에 알려줍니다.

설명
none 사용자가 동영상을 시청하지 않기로 선택했을 수 있으므로 아무것도 사전 로드하지 않습니다.
metadata 메타데이터 (길이, 크기, 텍스트 트랙)를 미리 로드하되 최소한의 동영상을 사용해야 합니다.
auto 전체 동영상을 즉시 다운로드하는 것이 바람직한 것으로 여겨집니다. 빈 문자열도 동일한 결과를 생성합니다.

preload 속성은 플랫폼마다 효과가 다릅니다. 예를 들어 Chrome의 경우 데스크톱에서 25초의 동영상을 버퍼링하지만 iOS 또는 Android에서는 전혀 버퍼링이 없습니다. 즉, 데스크톱에는 발생하지 않는 재생 시작 시 지연이 모바일에는 발생할 수도 있습니다. 자세한 내용은 오디오 및 동영상 미리 로드로 빠른 재생 또는 Steve Souders 블로그를 참고하세요.

이제 웹페이지에 미디어를 추가하는 방법을 알았으므로 청각 장애인이나 오디오 재생이 불가능한 경우에 동영상에 캡션을 추가하는 미디어 접근성에 대해 알아보겠습니다.