Перейти к содержимому
Калькуляторы

Стриминг с адаптивным битрейтом / Adaptive bitrate streaming

Нагуглившись начитавшись о сабже и различных его реализациях, решил попробовать поиграться c адаптивным HLS.

В перспективе хотелось бы применить технологию для публикации изображения с камеры на веб страничке, и чтобы была возможность просмотра с мобильных устройств на Android и iOS.

Если верить википедии, то HLS работает в Android 3/4 и iOS 4.3/5

Рекомендованные форматы: для Android, для iOS

 

C iOS всё просто:

<html>
   <head>
       <title>Apple Test</title>
       <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
   </head>
   <body style="background-color:#FFFFFF; ">
       <center>
           <video src="index.m3u8" controls autoplay ></video>
       </center>
   </body>
</html>

 

Но вот с Android уже не так просто.

Если на Android установить Adobe Flash 11, то будет работать плеер основанный на OSMF, но его еще предстоит найти или написать.

Смог нагуглить только два бесплатных плеера:

1) бета версия JWPlayer

2) плагин для MediaCore, который я так и не смог установить. Никаких инструкций по установке плагина тоже не нашёл.

 

Ну чтож, выбора особо нет... Встроил jwplayer в страничку:

<html>
<head>
   <script type="text/javascript" src="player.js"></script>
</head>
<body>
   <div id="player">You need Flash to play this</div>

   <script type="text/javascript">
       jwplayer("player").setup({
           file: 'high.m3u8',
           flashplayer: 'player.swf',
           provider:'adaptiveProvider.swf',
           width: 300,
           height: 200,
       });
       function loadStream(url) {
           jwplayer("player").load({file: url,provider: 'adaptiveProvider.swf'});
           jwplayer("player").play();
           return false;
       }
   </script>
</body>
</html>

 

Денег конечно же нет, поэтому пришлось установить vlc 2 + apache2 на Ubuntu 11.10 amd64

По умолчанию vlc подтянул обычный libavcodec, но позже я заменил его на libavcodec-extra

 

Первая попытка:

vlc -I dummy -R rtsp://login:password@mycamera.org/live.sdp \
   --sout='#std{access=livehttp{seglen=10, \
                                numsegs=3, \
                                index=/var/www/index.m3u8, \
                                index-url=http://mysite.org/segment-#.mts}, \
                mux=ts{use-key-frames}, \
                dst=/var/www/segment-#.mts}'

Камера уже отдаёт H264 (AVC+AAC), поэтому без транскодинга.

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

 

Попробовал отключить звук на камере и в vlc

vlc -I dummy -R rtsp://login:password@mycamera.org/live.sdp \
   --sout='#transcoding{acodec=none}:std{access=livehttp{seglen=10, \
                                                         numsegs=3, \
                                                         index=/var/www/index.m3u8, \
                                                         index-url=http://mysite.org/segment-#.mts}, \
                                         mux=ts{use-key-frames}, \
                                         dst=/var/www/segment-#.mts}'

Не помогло.

 

Попробовал с транскодингом звука:

vlc -I dummy -R rtsp://login:password@mycamera.org/live.sdp \
   --sout='#transcoding{acodec=aac}:std{access=livehttp{seglen=10, \
                                                        numsegs=3, \
                                                        index=/var/www/index.m3u8, \
                                                        index-url=http://mysite.org/segment-#.mts}, \
                                        mux=ts{use-key-frames},
                                        dst=/var/www/segment-#.mts}'

Не помогло.

 

Попробовал с транскодингом и звука и видео:

vlc -I dummy -R rtsp://login:password@mycamera.org/live.sdp \
   --sout='#transcoding{vcodec=h264,acodec=aac}:std{access=livehttp{seglen=10, \
                                                                    numsegs=3, \
                                                                    index=/var/www/index.m3u8, \
                                                                    index-url=http://mysite.org/segment-#.mts},
                                                    mux=ts{use-key-frames},
                                                    dst=/var/www/segment-#.mts}'

jwplayer не останвливается, но картинка очень сильно рассыпается - смотреть невозможно.

 

Позже нашёл причину остановки jwplayer на форуме longtailvideo.com

Получилось забирать H264 с камеры и транскодить только звук:

vlc -I dummy -R rtsp://login:password@mycamera.org/live.sdp \
   --sout='#transcoding{aenc=ffmpeg{aac-profile=low},acodec=mp4a,ab=128,channels=2,samplerate=44100}:std{access=livehttp{seglen=10, \
                                                                                                                         numsegs=3, \
                                                                                                                         index=/var/www/index.m3u8, \
                                                                                                                         index-url=http://mysite.org/segment-#.mts}, \
                                                                                                         mux=ts{use-key-frames}, \
                                                                                                         dst=/var/www/segment-#.mts}'

Показывает отлично.

 

Далее попробовал разбить поток на два: первый оригинальный - high.m3u8, а второй с заниженными разрешением, частотой кадров и битрейтом - low.m3u8

Указал их в общем index.m3u8

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=3000000
high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=50000
low.m3u8

vlc -I dummy -R rtsp://login:password@mycamera.org/live.sdp \
   --sout='#transcoding{aenc=ffmpeg{aac-profile=low},acodec=mp4a,ab=128,channels=2,samplerate=44100}:std{access=livehttp{seglen=10, \
                                                                                                                         numsegs=3, \
                                                                                                                         index=/var/www/high.m3u8, \
                                                                                                                         index-url=http://mysite.org/high-#.mts}, \
                                                                                                         mux=ts{use-key-frames}, \
                                                                                                         dst=/var/www/high-#.mts}' \
   --sout='#transcoding{vcodec=h264,width=174,height=144,fps=12,vb=50,aenc=ffmpeg{aac-profile=low},acodec=mp4a,ab=128,channels=2,samplerate=44100}:std{access=livehttp{seglen=10, \
                                                                                                                                                                       numsegs=3, \
                                                                                                                                                                       index=/var/www/low.m3u8, \
                                                                                                                                                                       index-url=http://mysite.org/low-#.mts}, \
                                                                                                                                                       mux=ts{use-key-frames},
                                                                                                                                                       dst=/var/www/low-#.mts}'

Как работает "адаптивность" проверять не стал, т.к. в low.m3u8 рассыпается картинка. :(

Проверял с разными источниками видео (камерами, файлами со статическим видео) - сыпется.

 

Боюсь что сам не справлюсь с рассыпанием картинки, поэтому прошу помощи... :)

Изменено пользователем Иванов Денис

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а вы уверенны что производительности хватает на перекодирование low-потока?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Должно хватать. :)

Была возможность взять для экспериментов целый свободный сервер на Core i7 975 3.33GHz + 3GB RAM + SSD.

Как уже писал выше, установил на этот сервер Ubuntu и VLC 2.

Так что все свободные ресурсы в распоряжении одного экземпляра VLC.

Изменено пользователем Иванов Денис

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

threads=2..4 внутри transcode пробовали ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У h264 есть встроенные profile. У VLC есть их маппинг profile=<slow|veryslow|fast|ultrafast|veryfast|placebo>. Можно попробовать ultrafast и оценить, есть ли рассыпания.

В любом случае если картинка сыпется то VLC в лог должен писать с чем же проблемы.

Может быть что угодно, начиная от реальных проблем с произсодительностью, заканчивая проблемами в сети.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так кто нибудь в реальности пользуется mediacore? Где можно увидеть в действии? Какие требования к серверу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

андроид нативно умеет hls. никакого флеша не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас