Содержимое, которое сканировалось раньше, представляет собой полные файлы, такие как целые файлы mp3 или mp4, но теперь многие видеосайты начали использовать потоковое видео ts для отображения видео. Интересно, есть ли у вас такой опыт? Мне очень интересно. веб-сайт фильма и приготовьтесь начать использовать метод сканирования Проверив запрос xhr, я думал, что смогу найти интерфейс, возвращающий mp4, но не ожидал, что вернут эту связку ts-файлов.
Сегодня мы поговорим о том, как скачать эти ts-файлы и склеить их в mp4.
ffmpeg,pycharm
Сначала откройте Google Chrome, F12 и проверьте запрос xhr. Думаю, вы уже знакомы с этим шагом. Как показано ниже
Есть два странных m3u8, без ошибок, это наш сегодняшний прорыв. Обычно хранилище в первом m3u8 — это URL-адрес второго файла m3u8, а второй файл m3u8 — это URL-адрес ts-файла хранилища. Потому что на этот раз мы в основном говорим о том, как скачать ts-файл, чтобы мы могли напрямую разобрать второй файл m3u8. Дважды щелкните этот запрос, чтобы просмотреть подробную информацию, где Запрос URL-адрес — это вызываемый интерфейс или удаленный файл. При прямом вызове файл m3u8 будет загружен, а затем проанализирован, и список URL-адресов TS можно будет получить для загрузки.
Давайте сначала посмотрим на содержимое этого файла m3u8.
Очевидно, что хранилище в файле не является полным адресом ts-файла. Нам нужно соединить его в соответствии с реальной ситуацией. Чтобы просмотреть его, нажмите на запрос ts-filexhr, чтобы просмотреть изображение ниже. тот, что в красной рамке, — это то, что мы хотим соединить перед именем файла. Это получает реальный адрес ts-файла.
Затем откройте весь код
Использование библиотеки m3u8 для анализа файлов m3u8
import m3u8
tss = []
order = []
#realurl — URL-адрес файла m3u8 с адресом хранилищац-файла. , возвращаемые таким образом данные имеют формат json, удобный для чтения данных.
data = m3u8.load(realurl).data
# Appendurl — это адрес, который нужно склеить перед Таким образом, все адреса ts-файлов, хранящиеся в tss, являются реальными адресами.
# Функция порядка заключается в обеспечении порядка склейки каждого ts-файла при объединении нескольких ts-файлов в один mp4.
for i in data["segments"]:
tss.append(appendurl + "/" + i["uri"])
order.append(i["uri"])
На данный момент получена последовательность склейки ts-файла и реальный адрес ts-файла.
Что-то сказать,Этих ts-файлов не только много,И маленький,Если мы просто загрузим файл,Какая пустая трата времени,И эффективность слишком низкая,На этот раз мы используем метод мульти-нити для загрузки большого количества ts-файлов.
def download(url, name):
#записать творение нить
task_list = []
# Получите реальный адрес и порядок тс
tss, order = getTss(url)
# Здесь порядок хранения ts-файлов указан в формате m3u8. Что касается того, почему мы это делаем, так это потому, что ts-файлов слишком много.
file = open("E://file//order.m3u8", 'w')
# Здесь введите локальный путь для загрузки ts-файла в order.m3u8.
for i in order:
file.write(f"file 'E:\\file\\ts\\" + i + "'");
file.write("\n")
Создание #нит пула
pool = ThreadPoolExecutor(max_workers=50)
for i in range(0, len(order)):
# Инициировать несколько загрузок файлов
task_list.append(pool.submit(FileDownload.downloadFile, 'E://file//ts//' + order[i], tss[i]))
# Определите, закончились ли все загрузки
while (True):
if len(task_list) == 0:
break
for i in task_list:
if i.done():
task_list.remove(i)
# Объединить несколько ts-файлов
VideoUtil.mixTss(name)
# После завершения слияния удалите весь ts-файл, иначе он займет слишком много места.
for u in order:
turl = f"E:\\file\\ts\\" + u
os.remove(turl)
основной код
# Здесь введите локальный путь для загрузки ts-файла в order.m3u8.
for i in order:
file.write(f"file 'E:\\file\\ts\\" + i + "'");
file.write("\n")
Что хранится в конечном файле
Лучше всего сохранять в этом формате. Другие форматы, найденные в Интернете ранее, выдадут ошибку, но с этим все в порядке.
yyy, многопоточность действительно мощная вещь, особенно при загрузке таких небольших файлов, многопоточность действительно потрясающая.
В этой статье используется метод пула потоков. Зачем использовать пул потоков? Потому что пул потоков может помочь нам сохранить простаивающие потоки в течение определенного периода времени, сократить время, затрачиваемое на создание и уничтожение потоков, значительно повысить эффективность многопоточности и в то же время поможет нам ограничить количество потоков. основной код
Создание #нит пула
pool = ThreadPoolExecutor(max_workers=50)
for i in range(0, len(order)):
# Инициировать несколько загрузок файлов
task_list.append(pool.submit(FileDownload.downloadFile, 'E://file//ts//' + order[i], tss[i]))
# Определите, закончились ли все загрузки
while (True):
if len(task_list) == 0:
break
for i in task_list:
if i.done():
task_list.remove(i)
Основная идея состоит в том, чтобы использовать только что созданный файл последовательности ts (order.m3u8) для объединения ts-файла в соответствии с порядком в файле.
Вам все равно понадобится использовать ffmpeg при склейке ts-файла. Если у вас его нет, вы можете проверить это и установить. руководство по установке ffmpeg основной код
def mixTss(name):
com = r'D:\\tool\\ffmpeg\\bin\\ffmpeg.exe -f concat -safe 0 -i E:\\file\\order.m3u8 -c copy E:\\file\\video2\\{}.mp4'.format(
name)
os.system(com)
Объясните здесь D:\tool\ffmpeg\bin\ffmpeg.exe : В качестве местоположения локального ffmpeg установите переменную среды и непосредственно ffmpeg.
E:\file\order.m3u8:Только что созданохранилищеts-файл Последовательность путей к файлам
E:\file\video2\{}.mp4:видео Место, где он хранится после окончательного синтеза.
На данный момент загрузка и синтез TS-видео в mp4 завершены.
Это фотография, сделанная в процессе загрузки. Давайте поговорим об этом. Очень здорово видеть, как взрывается количество файлов.
Короче говоря, это не так сложно, как я себе представлял, прежде чем делать это, но на самом деле это неплохо. Наконец, я приветствую ваш совет.