Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Некоторые веб-сайты предоставляютm3u8видеоадрес,Доступно для скачивания и просмотра. Или после анализа обнаруживается, что некоторые веб-сайты используют для воспроизведения формат m3u8.,В настоящее время вы можете скачать соответствующее видео по адресной ссылке m3u8.
1. О m3u8: (https://blog.csdn.net/baidu_34418350/article/details/64922512)
m3u8 — это стандарт воспроизведения видео, выпущенный Apple. Это тип m3u, но метод кодирования — utf-8. Это формат извлечения файлов, который разрезает видео на небольшие фрагменты видеофайлов формата ts и затем сохраняет их. сервер (теперь, чтобы уменьшить количество обращений к вводу-выводу, он вообще хранится в памяти сервера), разобрать путь через m3u8, а затем сделать запрос.
Пример ссылки:http://cdn.can.cibntv.net/12/201702161000/rexuechangan01/rexuechangan01.m3u8
первый этаж
#EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2650800,RESOLUTION=1920×1080 1.m3u8
Наблюдать за данными?,Начинать с http:// бесполезно.,не настоящий путь,Необходимо объединить строки и повторить запрос.:http://cdn.can.cibntv.net/12/201702161000/rexuechangan01/1.m3u8 получить данные
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:14 #EXTINF:11.480, 20170215T224129-1-0.ts #EXTINF:11.480, 20170215T224129-1-1.ts #EXTINF:10.480, 20170215T224129-1-2.ts #EXTINF:11.400, 20170215T224129-1-3.ts #EXTINF:11.120,
20170215T224129-1-4.ts
。。。
#EXTINF:1.000000, 3RCP49g82011159.ts #EXTINF:0.600000, 3RCP49g82011160.ts
#EXT-X-ENDLIST
Смотрите файл в конце ts, это реальный путь хранения видео:
http://cdn.can.cibntv.net/12/201702161000/rexuechangan01/20170215T224129-1-0.ts
В настоящее время вы можете загрузить ее с помощью браузера и играть в нее. Однако это воспроизведение не требует от нас анализа videoView после Android 4.0, который поддерживает автоматический анализ и объединение воспроизведения.
Android-код:
Uri uri = Uri.parse("http://cdn.can.cibntv.net/12/201702161000/rexuechangan01/rexuechangan01.m3u8");
video_view.setMediaController(new MediaController(this));
video_view.setVideoURI(uri);
video_view.requestFocus();
ideo_view.start();
Таким образом, вы можете просто воспроизводить видео в формате M3u8.
Загрузите его локально и откройте непосредственно с помощью программного обеспечения для видео:
2. Загрузка видео
доступныйpythonСкрипт автоматически загружает этиtsдокумент,Но на самом деле ts-файлы некоторых веб-сайтов зашифрованы с помощью AES-128.,так нужно Расшифроватьиграть。
Зашифрованное видео будет иметь ссылку на ключевой файл во втором слое m3u8:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:2 #EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.key" #key файл ключа
Вам необходимо прочитать этот ключевой файл, чтобы получить ключ дешифрования.
# -*- coding:utf-8 -*-
import os
import sys
import requests
import datetime
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
reload(sys)
sys.setdefaultencoding('utf-8')
def download(url):
download_path = os.getcwd() + "\download"
if not os.path.exists(download_path):
os.mkdir(download_path)
#Создаем новую папку с датами
download_path = os.path.join(download_path, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'))
#print download_path
os.mkdir(download_path)
all_content = requests.get(url).text # получатьпервый Содержимое файла этажM3U8
if "#EXTM3U" not in all_content:
raise BaseException("Ссылка не-M3U8")
if "EXT-X-STREAM-INF" in all_content: # первый этаж
file_line = all_content.split("\n")
for line in file_line:
if '.m3u8' in line:
url = url.rsplit("/", 1)[0] + "/" + line # Укажите URL второго слоя m3u8.
all_content = requests.get(url).text
file_line = all_content.split("\n")
unknow = True
key = ""
for index, line in enumerate(file_line): # второй этаж
if "#EXT-X-KEY" in line: # Найдите ключ дешифрования
method_pos = line.find("METHOD")
comma_pos = line.find(",")
method = line[method_pos:comma_pos].split('=')[1]
print "Decode Method:", method
uri_pos = line.find("URI")
quotation_mark_pos = line.rfind('"')
key_path = line[uri_pos:quotation_mark_pos].split('"')[1]
key_url = url.rsplit("/", 1)[0] + "/" + key_path # Укажите URL-адрес ключа расшифровки.
res = requests.get(key_url)
key = res.content
print "key:" , key
if "EXTINF" in line: # Найдите адрес ТС и скачайте его
unknow = False
pd_url = url.rsplit("/", 1)[0] + "/" + file_line[index + 1] # Укажите URL-адрес фрагмента ts.
#print pd_url
res = requests.get(pd_url)
c_fule_name = file_line[index + 1].rsplit("/", 1)[-1]
if len(key): # AES Расшифровать
cryptor = AES.new(key, AES.MODE_CBC, key)
with open(os.path.join(download_path, c_fule_name + ".mp4"), 'ab') as f:
f.write(cryptor.decrypt(res.content))
else:
with open(os.path.join(download_path, c_fule_name), 'ab') as f:
f.write(res.content)
f.flush()
if unknow:
raise BaseException("Соответствующая ссылка для скачивания не найдена")
else:
print «Загрузка завершена»
merge_file(download_path)
def merge_file(path):
os.chdir(path)
cmd = "copy /b * new.tmp"
os.system(cmd)
os.system('del /Q *.ts')
os.system('del /Q *.mp4')
os.rename("new.tmp", "new.mp4")
if __name__ == '__main__':
url = "http://cdn.can.cibntv.net/12/201702161000/rexuechangan01/rexuechangan01.m3u8"
download(_url)
3. Что касается ошибки расшифровки: нет модуля с именем Crypto.Cipher.
При использовании алгоритма AES в Python будет сообщено об указанной выше ошибке. Причина в том, что Crypto не является стандартным модулем и его необходимо устанавливать отдельно.
from Crypto.Cipher import AES
Первый метод: pip install pycropt. Если сообщается об ошибке, выберите второй метод.
Второй способ: использовать скомпилированный установочный пакет. http://www.voidspace.org.uk/python/modules.shtml#pycrypto
Если не работает, попробуйте другой. Если не работает, если вы установите две вышеуказанные версии, установите более низкую версию (у меня возникла ошибка при установке двух вышеуказанных версий на локальный компьютер, поэтому она будет работать после установки следующая версия)
Если ошибка по-прежнему возникает, перейдите в следующий каталог и измените регистр: (Я не сталкивался с этой проблемой)
C:\Python27\Lib\site-packages\crypto изменено на
C:\Python27\Lib\site-packages\Crypto
4. Объединить файлы
Все ts можно объединить в один файл через команду cmd:
copy /b d:\xxx\download_ts\* d:\xxx\download_ts\new.mp4
Просто вызовите merge_file напрямую, и временный файл будет удален.
Примите награды:
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/147426.html Исходная ссылка: https://javaforall.cn