HTTP 적응 형 비트 레이트 스트리밍은 iPhone에서 어떻게 작동합니까?
-
21-08-2019 - |
문제
Apple에는 iPhone OS 3.0에 HTTP 적응 형 비트 전송 스트리밍이 포함되어 있으며, 특히 Safari는 자동으로 처리합니다.
저렴한 방식으로 이것을 플레이하고 싶지만 최악의 경우 사용자 정의 HTTP 서버와 흥미로운 PHP/etc 스크립팅이 필요할 것으로 예상됩니다.
그러나 먼저 프로토콜 차이 또는 표준이 무엇인지 알아야합니다. HTTP는 프로토콜로서 합리적으로 간단하지만 적응 형 비트 레이트는 파일 크기가 다르고 청크 위치가 다른 비트 레이트에서 다르다는 것을 의미합니다. 모두 서버 측에서 처리 되었습니까?
최종 사용자의 버퍼링 일시 중지를 제거하는 것은 라이브 및 사전 녹음 된 비디오 스트림 모두에 매우 매력적이며, 많은 네트워크와 정부가 비 포트 80 트래픽을 제한하고 있다면 HTTP를 통해 두 가지를 모두 수행하는 것이 훨씬 좋습니다.
- HTTP 적응 비트 전송률 스트리밍, 특히 Apple의 구현에 대한 기술적 세부 사항은 무엇입니까?
HTTP 서버 자체의 일부인 모드의 일부인이 가장 잘 구현 된 것은 어디에 있습니까?
클라이언트 측면에 어떤 변경이 필요한가?
해결책
업데이트
Apple은 IETF 초안 제안을 만든 것처럼 보이며 일부 사람들은 이미 세그먼트를 연구하고 있습니다.
HTTP 라이브 스트리밍-Draft-Pantos-HTTP-Live-Streaming-01
http://tools.ietf.org/id/draft-pantos-pantos-live-streaming-01.txt
FFMPEG 및 오픈 소스 세그먼트와 함께 iPhone HTTP 스트리밍
http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/
HTTP 서버가 단순히 멍청한 HTTP 서버로 작용하는 것 같습니다. Akamai가 제공 한 예제 웹 사이트를 파악하면 정적 컨텐츠 스트리밍을 시작하기에 충분한 정보가 제공됩니다.
백서 ( http://www.akamai.com/dl/akamai/iphone_wp.pdf )는 전송 스트림 인코딩에 대한 정보를 제공하므로 .ts 스트림이 간단합니다.
인코더 (또는 별도의 세그먼터 프로세스)는 MPEG-2 TS 형식 (.ts)에서 일련의 작은 컨텐츠 세그먼트에서 H.264/AAC 함량을 생성합니다. 세그먼트를 참조하는 M3U8 인덱스 파일도 있습니다. 라이브 컨텐츠의 경우 M3U8은 최신 컨텐츠를 반영하도록 지속적으로 업데이트됩니다.
H.264 인코딩은 단일 패스 기준선 프로파일이어야합니다. 프레임 재 분격 비활성화. 키 프레임은 5 초마다 제안되며, 선택된 세그먼트 길이의 짝수 구 제수입니다.
웹 사이트는 M3U8 파일을 제공합니다.이 파일은 단순히 M3U 재생 목록이지만 UTF-8 문자 인코딩 형식입니다.
그런 다음 해당 파일은 각 비트 전송률에 대해 M3U8 파일로 연결됩니다. 나는 그들이 모두 같은 위치 (예 : 2 ~ 10 초마다)에서 컷을 가져와야한다고 가정하여 스위칭이 원활 할 수 있도록합니다. 클라이언트는 완전히 클라이언트 중심으로 보입니다. 클라이언트는 대역폭을 측정하는 방법과 어떤 버전을 얻을 것인지 결정합니다.
기본 파일의 내용은 다음과 같습니다.
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000
hi/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000
med/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
lo/prog_index.m3u8
그런 다음 다른 파일은 다음과 같습니다.
HI/prog_index.m3U8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
med/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
lo/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
이것은 HTML 5 비디오 태그와 함께 작동합니다.
<video width="640" height="480">
<source src="content1/content1.m3u8" />
</video>
여전히 답이없는 많은 질문이 있지만, 이것은 아마도 시작하기에 충분할 것입니다.
다른 팁
그리고 Python+Gstreamer의 작은 선수 http://code.google.com/p/hls-player/
오픈 소스 인코더 및 세그먼터 및 기타 멋진 물건에 대해서는 이것을 참조하십시오 :)