13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
1

Запись hls видео стрима в файл

13.04.2019, 22:04. Показов 2502. Ответов 15
Метки нет (Все метки)

Всех приветствую. Я разработал приложение, которое парсит html страницу и воспроизводит стрим, который она находит на ней, с помощью библиотеки exoplayer. Подскажите пожалуйста, как записать этот видео или аудио стрим в файл, чтобы сохранить его на sd карту или во внутреннюю память смарта без какого-либо преобразования стрима. Мне очень понравился способ, который я нашёл на сайте stackoverflow.com, а именно открытие адреса стрима, к примеру, через класс httpurlconnection, получение inputstream и побайтовая запись данных потока в файл, но при его использовании есть проблемы, решения которых я лично не знаю.
1. Когда я пытался открыть url стрима в браузере, то сервер отдаёт мне файл с расширением m3u8. Такая же ситуация была когда я пытался открыть этот стрим в python через библиотеку urllib, поэтому скорее всего она повторится и в java, а значит никакого потока байтов, которые воспроизводит библиотека exoplayer, я не получу.
2. Даже если я смогу как-то получить поток байтов, я не смогу определить, в каком формате идёт стрим, чтобы присвоить соответствующее расширение моему файлу, в который будет идти запись.
3. Также я не могу отследить, когда во внутренней памяти смарта или на sd карте не будет памяти, чтобы остановить запись стрима в файл.
4. Ещё я не могу при обрыве интернет соединения и переподключении к стриму (соответствующий метод реализованы в моей программе) продолжить запись в тот же файл, вместо создания нового файла.
Подскажите пожалуйста, как я могу записать стрим в файл, решив выше написанные проблемы, без использования сторонних библиотек. Если же без сторонних библиотек эти проблемы решить нельзя, подскажите пожалуйста очень хорошую стороннюю библиотеку, которая позволяет записывать видео и аудио стрим в файл без каких-либо преобразований, решая выше написанные проблемы. Заранее благодарю всех за помощь.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2019, 22:04
Ответы с готовыми решениями:

I7-7700 или i5-7600, 6400 (ПК для стрима/игр/видео работы)
Добрый день, Помогите, пожалуйста, определиться со сборкой: 1. Материнская плата MSI B250M...

Ноутбук для игр, стрима DOTA2 с 100+ фпс, монтажа видео
Добрый вечер. Нужен мощный ноут для игр, стрима DOTA2 с 100+ фпс и для монтажа видео. Так же...

AVIWRITER - запись видео в файл
Здравствуйте ! Разбираюсь с библиотекой AForge. Вывод из камеры на экран удался на "Ура". А вот...

Запись стрима через видеокарту второго пк без потери качества
Привет! Очень нужен ваш совет. Есть два пк. Пк1 видеокарта 1080ti с него ведётся стрим через obs....

15
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
15.04.2019, 08:20 2
КАВ, я бы начал с « как работает hls»
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
15.04.2019, 16:29  [ТС] 3
Я Вас не совсем понял. Вы имеете ввиду,что с hls стрим записать вообще нельзя?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
15.04.2019, 18:19 4
КАВ, думаю можно, мой комментарий относится к тому что получение m3u для hls нормально и если это для вас сюрприз то что то пошло не так
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
15.04.2019, 19:09  [ТС] 5
А как же тогда получить сам воспроизводимый поток, чтобы побайтово записать его в файл?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
16.04.2019, 12:33 6
КАВ, запрашиваете плей-лист (m3u8), в нем перечисляются фрагменты с отметкамии времени, выкачиваете фрагменты (каждый фрагмент - это вполне смотрибельный очень короткий кусочек видео в виде ts файла) и собираете из них видео
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
16.04.2019, 20:26  [ТС] 7
Я Вас не совсем понял. Мне нужно как-то парсить этот файл и получать ссылки на фрагмент? Не могли бы Вы пожалуйста привести пример кода, т.е как это делать? К примеру как мне выкачивать фрагменты из такого файла:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1200036,RESOLUTION=640x360,CODECS="avc1.64001e ,mp4a.40.2"
receiver/44_p2/chunks.m3u8?nimblesessionid=2150074&wmsAuthSign=c2VydmVyX3Rp bWU9NC8xNi8yMDE5IDU6MTg6NDAgUE0maGFzaF92YWx1ZT1uVXVmMTMremhW cUpzNEJNallCeElnPT0mdmFsaWRtaW51dGVzPTE0NDAmaWQ9NWNiNjBlNzBk OGQ1MA==
Я скачивал этот файл по адресу http://vod-c56.interspace.com:... kyODMxOA== (Вы не сможете проверить этот адрес, поскольку он привязывается к ip адресу, но если Вам нужен для примера работающий везде m3u8, то Вы можете взять m3u8 файл отсюда: https://hls-01-dorognoe.emgsou... ylist.m3u8. Заранее благодарю Вас за помощь.
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
17.04.2019, 06:39 8
КАВ, по ссылке https://hls-01-dorognoe.emgsou... ylist.m3u8 доступен мастер плей-лист имеющий такое содержимое
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,CODECS="mp4a.40.2"
128/playlist.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000,CODECS="mp4a.40.2"
64/playlist.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=32000,CODECS="mp4a.40.2"
32/playlist.m3u8
каждый элемент мастер плей-листа является дочерним плей-листом доступным по ссылке <URL плей-листа без имени документа>/<имя элемента> - то есть первый дочерний плей-лист доступен по ссылке https://hls-01-dorognoe.emgsou... ylist.m3u8 и имеет такое содержимое
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:75598
#EXTINF:4.99229,
out75598.ts
#EXTINF:4.99229,
out75599.ts
#EXTINF:4.99229,
out75600.ts
#EXTINF:4.99229,
out75601.ts
#EXTINF:4.99229,
out75602.ts
#EXTINF:4.99229,
out75603.ts
каждый элемент дочернего плей-листа является фрагментом доступным по ссылке <URL плей-листа без имени документа>/<имя элемента> - то есть первый фрагмент доступен по ссылке https://hls-01-dorognoe.emgsou... ut75598.ts - при достаточном проворстве (так как мы имеем дело с поточным вещанием имена дочерних плей-листов и фрагментов все время меняются) мы даже можем скачать этот фрагмент и воспроизвести его, например, при помощи ffmpeg
ffplay out75598.ts

Input #0, mpegts, from 'out75598.ts':
Duration: 00:00:04.90, start: 91409.900267, bitrate: 107 kb/s
Program 1
Stream #0:0[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 88 kb/s
Stream #0:1[0x102]: Data: timed_id3 (ID3 / 0x20334449)
видим что это фрагмент аудио-потока, ухо ласкает голос Киркорова, видимо мы слушаем поточное вещание дорожного радио)
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
18.04.2019, 00:18  [ТС] 9
Я попробовал проделать Ваш алгоритм с файлом m3u8 с сайта, с которого программа парсит m3u8 файл и воспроизводит его с помощью библиотеки exoplayer. В принципе у меня всё прекрасно получилось. Сначала я получил файл chunks.m3u8 из файла playlist.m3u8, а в файле chunks.m3u8 я получил четыре ссылки на ts файлы. Но у меня возникло несколько вопросов.
1. Как Вы в конце получили из ts файла информацию о нём, ведь ts файл, как я понял, не текстовый, а двоичный, я имею ввиду, к примеру, строку:
Program 1
Stream #0:0[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 88 kb/s
Как я смогу получить эту информацию из ts файла в java? 2. Правильно ли я считаю, что строка в файле playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1179365,RESOLUTION=640x360,CODECS="avc1.64001e ,mp4a.40.2" говорит мне о том, что я смело могу дать моему файлу, куда я буду писать байты, расширение mp4a? Если нет, то как мне определить, какое расширение мне нужно дать этому файлу? 3. Как я ранее писал у меня получилось четыре ts файла. Как я понял, мне нужно выкачивать каждый ts файл, т.е добавлять байты каждого ts файла к файлу, в который я буду записывать стрим, затем снова выкачивать файл chunks.m3u8 с новыми ссылками на ts файлы и так покругу. Но я заметил, что если ts файлы быстро не скачать, ссылки на них будут недоступны, т.е может получиться так, что пока я буду выкачивать один ts файл, ссылки на остальные файлы будут недоступны, а значит при использовании такого способа я буду при записи терять куски информации. Посоветуйте пожалуйста, как же мне тогда поступить в таком случае? 4. Моё приложение парсит страницу и извлекает url очень просто. Оно находит строку, содержащую .m3u8 затем находит индекс, в этой строке, где начинается http:/, затем обрезает все лишние символы и в результате получается ссылка на файл .m3u8, т.е моя программа получает url стрима без костылей, таких как htmlparser(название класса написано неточно) и т.д. Парсить m3u8, как я представляю, без костылей будет очень сложно, поэтому может быть есть какие-то библиотеки или готовые алгоритмы на java, чтобы не изобретать велосипед хотя, после полученных от Вас знаний, при желании конечно можно что-то сваять, но может всё же есть готовые решения, которые сами парсят m3u8 и вставляют нужные адреса для скачки новых m3u8 и ts файлов? Заранее благодарю всех за помощь.
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
18.04.2019, 08:05 10
КАВ,
1 информацию я получил в консоли десктопа при воспроизведении файла утилитой ffplay входящей в пакет ffmpeg, зачем она вам в Java?
2 не уверен, надо читать спецификацию
3 потоковая передача подразумевает что время скачивания фрагмента меньше продолжительности фрагмента и вы никогда не «отстанете» от потока - если же это произошло по независящим от вас причинам то очевидно нужно предусмотреть механизм «наверстывания» - при этом конечно же «пропущенные» фрагменты вам уже никто не отдаст - в суммарном файле просто будет «перескок»
4 разобрать m3u8 не сложно, если даже для этого хочется библиотеку то лучше бросьте вы своё занятие
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
18.04.2019, 22:58  [ТС] 11
Она мне нужна в java, чтобы понять, какое расширение мне нужно давать суммарному файлу, к примеру mp4 или,к примеру,aac,если это чисто аудио стрим. Правильно ли я понимаю, что когда я последовательно буду скачивать четыре файла, то не один из них не потеряется, или лучше создать четыре параллельных потока для одновременного скачивания всех ts файлов, чтобы потом по очереди записать их в суммарный файл? По поводу разбора m3u, как я ранее писал, это можно реализовать, просто я думал, что есть какие-то готовые решения, чтобы не изобретать алгоритм разбора m3u8 файла с нуля.
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
19.04.2019, 06:33 12
КАВ, mp4 - это не признак того что в файле видео, это название контейнера, в контейнере может быть только звуковая дорожка и это будет прекрасный аудио-файл. качать можете как вам удобно - главное что бы время получения файлов не отставало от трансляции, "разбор с нуля" m3u8 - это могучее разбиение текста на строки по CRLF и немножко вычитывания того что там в строках, дааа....
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
19.04.2019, 15:59  [ТС] 13
В том то и проблема, что если ts файлов много, а скорость у пользователя маленькая, то при последовательном скачивании каждого ts файла может получиться так, что ссылка на очередной файл не будет работать, По этому, наверное, наиболее правильный вариант,это одновременное скачивание нескольких файлов и потом последовательная запись их в файл. Ещё, конечно, наверное можно скачивать только первый ts файл, а потом снова скачивать файл chunks.m3u8, или это не совсем правильный подход? Кстати может ли получиться так, что при очередном скачивании файла chunks.m3u8 я скачаю тот ts файл, который я раньше скачивал, т.е будут повторения в записи, которых не было в реальной трансляции? Если такое может быть, то как избежать этой ситуации? Ещё хотелось бы заранее уточнить,будут ли щелчки при соединении ts файлов, как это было, к примеру, когда я генерировал звуковые сигналы, т.е нужно ли мне будет считать фазу и как-то преобразовывать байты перед их записью в суммарный файл?
Раз np4 это не всегда видео, то как мне определить, какое расширение мне нужно будет задать суммарному файлу?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
19.04.2019, 18:33 14
КАВ, если пропускная способность вашего соединения такая что время скачивания фрагмента больше длительности его воспроизведения то никакие способы вам не помогут. точка. Фрагменты качаются один за другим без пропусков. Возможно (в значении может да, а может нет) дополнительно придётся учитывать время указанное в плей-листе. Будут или нет щелчки (и вообще - нормально ли байт в байт класть фрагменты в файл) точно не скажу - пробуйте. Желание заранее знать что в трансляции (видео или звук) очень странное - обычно это известно из задачи
0
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 153
19.04.2019, 18:56  [ТС] 15
Я Вас не понял,как мне поможет учёт времени плейлиста, или Вы имеете ввиду то, что нужно сравнивать время текущего плейлиста с временем предыдущего плейлиста и из этого делать выводы? Заранее хочу уточнить, что делать, если вдруг щелчки между файлами будут. Дело в том, что на сайте, откуда программа парсит адрес стрима, есть и аудио и видео hls стримы, поэтому мне нужно точно знать, какое расширение дать моему файлу, просто вдруг я присвою ему, к примеру, расширение aac, а там будет видео mp4.
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
20.04.2019, 18:02 16
КАВ, время плейлиста вам поможет если вы промухали фрагмент что бы правильно выбрать какой хватать дальше, однако эта проблема как и щелчки очень далеко на горизонте, начните наконец что то делать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2019, 18:02

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Слежение в локальной сети (запись в видео файл)
Может кто-нить подскажет программу для слежения в локальной сети за рабочим столом чтобы она...

Запись с видео должна автоматически выводиться в рубрике видео
Добрый день, вечер или утро! Я вот с таким вопросом. Нужно на wp реализовать такую возможность: при...

Запись видео как перегнать видео с VHS кассет
Доброго времени суток господа. Для начала попрошу прощения если сделал что то не так. Вопрос: как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.