포스트

2023-10-17-TIL

2023-10-17-TIL

Today I Learned

Progressive Download

위키백과는 progressive download를 주로 HTTP로 미디어 파일을 내려받으면서, 다 받기 전부터 재생을 시작하는 방식으로 설명한다. 사용자 경험은 스트리밍과 비슷하지만, 파일은 실제로 사용자 기기(대개 브라우저 임시 디렉터리)에 저장된다. 웹 서버에 MP4 파일을 올려 두고 <video src>로 가리키기만 해도 동작하므로 가장 간단한 영상 전달 방식이다.

다운로드 도중 재생하려면 플레이어가 재생 정보를 먼저 알아야 한다. MP4는 atom이라는 덩어리로 이루어지고, 재생 방법(길이, 해상도, 프레임 위치 등)은 moov atom에 담긴다. 이 atom이 파일 끝에 있으면 파일을 다 받아야 재생할 수 있으므로, ffmpeg의 -movflags faststart처럼 moov를 파일 앞으로 옮기는 최적화를 한다.

  • https://en.wikipedia.org/wiki/Progressive_download
  • https://www.nginx.com/resources/glossary/progressive-download/
  • https://www.brightcove.com/en/resources/blog/progressive-download-versus-streaming/
  • https://www.netmanias.com/ko/post/blog/5819/google-http-adaptive-streaming-http-progressive-download-ott-video-streaming-youtube/youtube-switched-to-chunking-and-adaptive-streaming
  • https://docs.edgecast.com/cdn/Content/Streaming/HPD/HTTP_Progressive_Download.htm

Streaming

스트리밍은 미디어를 다 받아 저장한 뒤 재생하는 대신, 네트워크로 받는 대로 재생하는 전달 방식이다. 오늘날 웹의 영상 스트리밍은 대부분 HLS나 MPEG-DASH 같은 HTTP 기반 적응형 스트리밍이다. 영상을 여러 비트레이트로 인코딩하고 몇 초 길이의 세그먼트로 잘라 두면, 플레이어가 네트워크 상황을 보며 세그먼트마다 알맞은 화질을 골라 받는다.

  • https://en.wikipedia.org/wiki/Streaming_media

Progressive Download vs Streaming

둘의 차이는 전달 단위와 화질 선택에서 나온다.

구분Progressive download적응형 스트리밍(HLS, DASH)
전달 단위파일 하나짧은 세그먼트 여러 개와 재생 목록
화질파일 하나의 화질로 고정네트워크에 따라 세그먼트마다 변경
준비 작업파일 업로드만 하면 됨여러 화질로 트랜스코딩하고 패키징
낭비사용자가 중간에 나가도 이미 받은 부분은 버려짐필요한 구간만 받음

짧은 영상이나 트래픽이 적은 서비스는 progressive download로도 충분하다. 긴 영상이나 모바일 네트워크 사용자가 많다면 적응형 스트리밍이 끊김과 대역폭 낭비를 줄인다. 넷매니아스 글은 YouTube가 progressive download에서 청크 단위의 적응형 스트리밍으로 옮겨 간 과정을 다룬다.

  • https://www.webtvsolutions.com/support.php?s=other_docs&d=streaming_progressive_vs_streaming&lang=en
  • https://www.ezs3.com/public/Streaming_or_Progressive_Download_How_do_I_choose.cfm
  • https://yoooonghyun.gitbook.io/documents/multimedia/overview

Shaka Packager vs Bento4

적응형 스트리밍을 하려면 인코딩한 영상을 HLS·DASH 형식의 세그먼트와 재생 목록으로 만드는 패키징 단계가 필요하다. 이 단계에 쓰는 대표적인 오픈소스 도구가 두 가지다.

  • Shaka Packager: README가 DASH와 HLS 패키징 및 암호화를 위한 도구이자 SDK라고 소개한다. Widevine 같은 DRM 시스템을 위한 Common Encryption을 지원한다.
  • Bento4: ISO-MP4 파일을 읽고 쓰는 C++ 라이브러리와 도구 모음이다. mp4fragment로 fragmented MP4를 만들고, mp42hls로 MP4를 HLS 세그먼트와 .m3u8 재생 목록으로 바꾸는 식으로 기능별 명령줄 도구가 나뉘어 있다.

인코딩 자체는 둘 다 하지 않으므로 보통 ffmpeg로 여러 화질을 인코딩한 뒤 패키저로 넘긴다. 아래 dev.to 글들이 ffmpeg 사용법을 정리한다.

  • https://www.reddit.com/r/VIDEOENGINEERING/comments/mu2fed/mpegdash_packaging_tutorials_using_gpac_bento4/
  • https://dev.to/siumhossain/all-about-ffmpeg-a-very-fast-video-and-audio-converter-51pk
  • https://dev.to/siumhossain/all-about-fmped-18hc

Public Domain

위키백과는 퍼블릭 도메인을 배타적 지식재산권이 적용되지 않는 모든 창작물로 정의한다. 권리가 만료됐거나, 상실됐거나, 포기됐거나, 애초에 적용되지 않는 경우다. 같은 문서에 따르면 대부분의 나라에서 저작권은 마지막 생존 저작자 사망 후 70년이 지난 다음 해 1월 1일에 만료된다. 국가별 저작권 보호 기간 목록에서 한국도 저작자 사후 70년으로 나온다.

저작자가 살아 있는 동안 스스로 권리를 내려놓을 수도 있다. Creative Commons는 자기 저작물을 퍼블릭 도메인에 기증할 때 쓰는 CC0와, 이미 퍼블릭 도메인인 저작물에 표시하는 Public Domain Mark를 구분해 제공한다. 서비스에서 음원이나 영상 같은 외부 콘텐츠를 쓸 때는 퍼블릭 도메인 여부를 나라별 보호 기간 기준으로 확인해야 한다.

  • https://en.wikipedia.org/wiki/Public_domain
  • https://creativecommons.org/public-domain/
  • https://www.copyrightlaws.com/what-is-the-public-domain/
  • https://fairuse.stanford.edu/overview/public-domain/welcome/#:~:text=The%20term%20%E2%80%9Cpublic%20domain%E2%80%9D%20refers,an%20individual%20author%20or%20artist.
  • https://www.copyright.or.kr/information-materials/dictionary/view.do?glossaryNo=442&pageIndex=43&searchIdx=&searchText=&searchTarget=&searchLangType=&pageDisplaySize=10&clscode=01&searchkeyword=
  • https://en.wikipedia.org/wiki/List_of_countries%27_copyright_lengths
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다