HLS: невозможно воспроизвести загруженную копию потока Apple

РЕДАКТИРОВАТЬ

Теперь мой вопрос решен (см. ниже), и каждый может использовать этот скрипт для загрузки потоков m3u8, таких как bipbop от Apple.

ОРИГИНАЛЬНЫЙ ВОПРОС

Я создал этот хороший скрипт для загрузки примера HLS-потока Apple BipBop. Однако я не могу играть в нее. Если вы поможете мне решить эту проблему, мы все сможем насладиться этим скриптом:

#!/bin/bash
unset PROMPT_COMMAND
set -x
URL=https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8
MANIFESTNAME=$(basename $URL)
LOCAL_MANIFEST=$MANIFESTNAME
URLPREF=$(dirname $URL)

wget $URL -O $LOCAL_MANIFEST

cat $LOCAL_MANIFEST | grep "#EXT-X-STREAM-INF:" -A1 | grep m3u8 > all_playlists.txt
cat $LOCAL_MANIFEST | grep "#EXT-X-MEDIA.*URI" | sed -e 's_.*URI=\"\(.*\)\".*_\1_' >> all_playlists.txt
#this will yield files which we already downloaded, but we want the index file itself
cat $LOCAL_MANIFEST | grep "#EXT-X-I-FRAME-STREAM-INF.*URI" | sed -e 's_.*URI=\"\(.*\)\".*_\1_' >> all_playlists.txt

while read playList; do
  FOLDER=$(dirname $playList)
  PL_NAME=$(basename $playList)
  LOCAL_PL=$FOLDER/$PL_NAME
  mkdir -p $FOLDER 2> /dev/null
  PL_URL=$URLPREF/$playList

  echo "PL_URL=$PL_URL"
  TSL=${FOLDER}_TSList.txt
  wget $PL_URL -O $LOCAL_PL 
  echo "LOCAL_PL=$LOCAL_PL"
  cat $LOCAL_PL | grep -v "^#" | uniq > $TSL
  echo "====== media list ======="
  cat $TSL
  echo "========================="
  #TS is actually any media file
  while read ts; do
    TS_NAME=$URLPREF/$FOLDER/$ts
    LOCAL_TS=$FOLDER/$ts
    echo $TS_NAME
    if [ -s $LOCAL_TS ]; then
      echo "Already exists. skiping."
    else
      wget $TS_NAME -O $LOCAL_TS
    fi
  done < $TSL
  rm $TSL
done < all_playlists.txt
rm all_playlists.txt
find . -name Thumbs.db -exec rm {} \;

Когда поток готов, я запускаю http-сервер, используя http-сервер Python:

http-server -p 8090

а затем попробуйте сыграть с помощью этой команды:

open http://localhost:8090/bipbop_16x9_variant.m3u8 -a Safari

http-сервер показывает нормальные запросы:

[12:24:51] "GET /bipbop_16x9_variant.m3u8" "Mozilla/5.0 (Macintosh..."
[12:24:51] "GET /gear1/prog_index.m3u8" "Mozilla/5.0 (Macintosh..."
[12:24:52] "GET /gear1/main.ts" "Mozilla/5.0 (Macintosh..."
[12:24:52] "GET /subtitles/eng_forced/prog_index.m3u8" "Mozilla/5.0 (Macintosh..."
[12:24:52] "GET /subtitles/eng_forced/fileSequence0.webvtt" "Mozilla/5.0 (Macintosh..."
[12:24:52] "GET /gear0/prog_index.m3u8" "Mozilla/5.0 (Macintosh..."
[12:24:52] "GET /gear0/main.aac" "Mozilla/5.0 (Macintosh..."
[12:24:52] "GET /subtitles/eng_forced/fileSequence1.webvtt" "Mozilla/5.0 (Macintosh..."

Но Safari не может воспроизвести поток, показывая сообщение «Отсутствует подключаемый модуль»…

Любая идея, пожалуйста ??? нам нужен этот поток для разработки iOS...


person ishahak    schedule 26.05.2016    source источник
comment
Какой Content-Type отправляется с сервера при отправке файла m3u8?   -  person libertyernie    schedule 27.05.2016


Ответы (1)


Итак, благодаря комментарию @libertyernie эта проблема теперь решена. На самом деле я сам подозревал эту проблему: модуль http-сервера Python не является правильным инструментом для обслуживания потоков m3u8, потому что его нельзя настроить для правильных типов контента.

Лучшим инструментом является http://redmine.lighttpd.net/projects/lighttpd/wiki/TutorialConfiguration.

Установка:

brew install lighttpd

Теперь создайте файл конфигурации lighttpd.conf:

server.document-root = "<full-path-no-~>/bipbop" 
server.port = 8090
mimetype.assign = (
  ".html" => "text/html", 
  ".txt" => "text/plain",
  ".jpg" => "image/jpeg",
  ".png" => "image/png",
  ".m3u8" => "application/vnd.apple.mpegurl",
  ".ts" => "video/MP2T"
)

Последние две строки имеют решающее значение для нашего успеха. Теперь мы можем запустить наш потоковый сервер:

lighttpd -D -f lighttpd.conf

А теперь мы можем открыть http://localhost:8090/bipbop_16x9_variant.m3u8 и посмотреть трансляцию.

person ishahak    schedule 29.05.2016