Python 파충류 의 m3u 8 파일 에서 작은 동 영상 을 추출 하 는 정확 한 자세

9350 단어 Pythonm3u8비디오
머리말
인터넷 에서 얻 은 작은 동 영상(.ts 형식)이 열 리 지 않 으 면 어떻게 합 니까?IDM 다운 로드 를 사용 하면 가끔 나타 날 때 가 있 습 니 다 ,IDM .어떻게 해결 합 니까?이 블 로 그 는 m3u 8 파일 의.ts동 영상 을 정확하게 추출 하고 완전한.mp4형식 동 영상 을 합성 하 는 방법 에 대해 이야기 했다.
在这里插入图片描述
在这里插入图片描述
1.HLS 프로 토 콜 과 m3u 8 파일
  HLS,즉 H T P  L i v e   S t r e a m i n g HTTP\ Live\ Streaming HTTP Live Streaming 의 줄 임 말 은 애플 이 HTTP 기반 스 트림 미디어 네트워크 전송 프로 토 콜 을 제시 한 것 이다.애플 의 퀵 타임 X 와 아이 폰 소프트웨어 시스템 의 일부분 이다.그것 의 작업 원 리 는 전체 흐름 을 작은 HTTP 기반 파일 로 나 누 어 다운로드 하 는 것 이다.매번 조금 만 다운로드 하 는 것 이다.미디어 흐름 이 재생 되 고 있 을 때 클 라 이언 트 는 다양한 예비 소스 에서 서로 다른 속도 로 같은 자원 을 다운로드 하여 스 트림 미디어 세 션 이 서로 다른 데이터 속도 에 적응 하도록 할 수 있 습 니 다.스 트림 미디어 세 션 을 시작 할 때 클 라 이언 트 는 메타 데 이 터 를 포함 한 확장 M3U(m3u 8)재생 목록 파일 을 다운로드 하여 사용 가능 한 미디어 스 트림 을 찾 습 니 다.
  M3U8는 U n i c o d e 유 니 코드 유 니 코드 버 전의 M3U 로 UTF-8 로 인 코딩 한다.'M3U"와"M3U 8"파일 은 모두 애플 이 사용 하 는 H T P 입 니 다.  L i v e   S t r e a m i n g HTTP\ Live\ Streaming HTTP Live 스 트 리밍 형식의 기본 으로 아이 폰 과 맥 북 등에 서 재생 할 수 있다.멀티미디어 목록 을 재생 하 는 파일 형식 으로 텍스트 내용 은 일련의 미디어 세 션 자원 으로 이 세 션 자원 을 순서대로 재생 하면 멀티미디어 자원 을 완전 하 게 보 여줄 수 있다.그 형식 은 대체로 다음 과 같다.

#    
	#EXTM3U
	#EXT-X-VERSION:3
	#EXT-X-TARGETDURATION:8
	#EXT-X-MEDIA-SEQUENCE:0
	#EXTINF:4.000000,
	1af12fece7a000000.ts
	#EXTINF:4.320000,
	1af12fece7a000001.ts
	...
	#EXTINF:3.800000,
	1af12fece7a001155.ts
	#EXT-X-ENDLIST
	
	#   
	#EXTM3U
	#EXT-X-VERSION:3
	#EXT-X-TARGETDURATION:6
	#EXT-X-PLAYLIST-TYPE:VOD
	#EXT-X-MEDIA-SEQUENCE:0
	#EXT-X-KEY:METHOD=AES-128,URI="https://ts1.yuyuangewh.com:9999/20200808/1XdSSbTb/2000kb/hls/key.key"
	#EXTINF:3,
	https://ts1.yuyuangewh.com:9999/20200808/1XdSSbTb/2000kb/hls/EUtRrqJU.ts
	#EXTINF:4.72,
	https://ts1.yuyuangewh.com:9999/20200808/1XdSSbTb/2000kb/hls/HF90vrrN.ts
	...
	#EXTINF:0.24,
	https://ts1.yuyuangewh.com:9999/20200808/1XdSSbTb/2000kb/hls/b7ZLcRqT.ts
	#EXT-X-ENDLIST
   중국어 위 키 피 디 아----HTTP 라 이브 스 트 리밍
   중국어 위 키 백과-M3U
  다음은 몇 가지m3u8 에서 흔히 볼 수 있 는 라벨 을 소개 합 니 다.
라벨
격식.
역할.EXTM3U #EXTM3U이 파일 은 m3u 8 파일 임 을 표시 합 니 다.m3u 8 파일 마다 이 탭 을 첫 줄 에 두 어야 합 니 다.EXT-X-VERSION EXT-X-VERSION:<number>이 파일 은 m3u 8 파일 임 을 표시 합 니 다.m3u 8 파일 마다 이 탭 을 첫 줄 에 두 어야 합 니 다.EXT-X-TARGETDURATION #EXT-X-TARGETDURATION:<s>각 동 영상 세그먼트 의 최대 시간(단위 초)을 표시 합 니 다.EXT-X-PLAYLIST-TYPE #EXT-X-PLAYLIST-TYPE:<type-enum>스 트림 미디어 형식 을 표시 합 니 다.VOD이 화면 이 점파 원 으로 흐 르 기 때문에 서버 에서 이m3u8파일 을 변경 할 수 없습니다.EVENT이 동 영상 이 생방송 소스 로 흐 르 기 때문에 서버 는 이 파일 의 임의의 부분 을 변경 하거나 삭제 할 수 없 지만 파일 말미 에 새로운 내용 을 추가 할 수 있다.EXT-X-MEDIA-SEQUENCE #EXT-X-MEDIA-SEQUENCE:<number>재생 목록 의 첫 번 째 URL 세 션 파일 의 시리 얼 번 호 를 표시 합 니 다.모든 미디어 세 션 URL 은 유일한 전체 시리 얼 번 호 를 가지 고 있 습 니 다.모든 미디어 세 션 시리 얼 번 호 는 나타 나 는 순서대로 1 을 추가 합 니 다.이 탭 이 지정 되 지 않 으 면 기본 시리 얼 번 호 는 0 부터 시작 합 니 다.EXT-X-KEY #EXT-X-KEY:METHOD=AES-128,URI="http:xxxx",IV="xxxx"비디오 스 트림 파일 의 복호화 방법 을 표시 합 니 다.METHOD암호 화 방식 을 표시 합 니 다.URI키 경 로 를 표시 합 니 다.이 키 는 16 바이트 의 데이터 입 니 다.IV128 비트 의 16 진수 입 니 다.EXTINF #EXTINF:<duration>,[<title>]다음 URL 에서 지정 한 미디어 세 션 의 시간(단 위 는 초)을 나타 내 고duration10 진법 의 정형 또는 부동 소수점 형 이 될 수 있 으 며 그 값 은EXT-X-TARGETDURATION지정 한 값 보다 작 거나 같 아야 합 니 다.EXT-X-ENDLIST #EXT-X-ENDLISTm3u 8 파일 의 끝 표시
m3u 8 파일 형식 상세 설명 작성 자:Whyn
2.제3자 라 이브 러 리-m3u 8
『8195』m3u8는 m3u 8 파일 을 분석 하 는 데 사용 되 는 해석 기 입 니 다.라 이브 러 리 에 대한 상세 한 조작 은 참고 하 십시오공식 예시.

#   m3u8
	pip install m3u8

#   m3u8  
	import m3u8

	#     M3U8  
	playlist = m3u8.load(uri='http://videoserver.com/playlist.m3u8')	# url
	# playlist = m3u8.load(uri='playlist.m3u8')	# file
	print(playlist.segments)	#   EXT-X-KEY      EXTINF  :
	print(playlist.target_duration)	#   EXT-X-TARGETDURATION    

	for key in playlist.keys:
		if key:
			#         ,        
			print(key.uri, key.method, key.iv)
3.mp4 파일 합성
在这里插入图片描述
 이번 동 영상 을 예 로 들 면 절 차 는 다음 과 같다.
동 영상 에 대응 하 는1.파일 을 찾 습 니 다.
  .m3u8해석2.파일,그 중에서 추출.m3u8영상의 url
  .ts형식의 동 영상 다운로드3.  .ts형식의 동 영상 복호화4.동 영상

#  1 ,   m3u8  ,       m3u8     url
	playlist = m3u8.load(uri='./data/index.m3u8')

	#  2 ,  URL
	for seg in playlist.segments:
        print(seg.uri)
    
    #  3 ,  ts  
    with open('xxxxx.ts', 'wb') as f:
        ts = get_ts(url)
        f.write(ts)
   
	#  4 ,  
	cipher_text = pad(data_to_pad=cipher_text, block_size=AES.block_size)
    aes = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
    cipher_text = aes.decrypt(cipher_text)
    
	#  5 ,  
	files = glob.glob(os.path.join('./video', '*.ts'))
    for file in files:
        with open(file, 'rb') as fr, open('./video_de/baitoushan.mp4', 'ab') as fw:
            content = fr.read()
            fw.write(content )
4.전체 코드

# -*- coding: utf-8 -*-
# @Time    : 2021/5/10 20:11
# @Author  : XiaYouRan
# @Email   : [email protected]
# @File    : video.py
# @Software: PyCharm


from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from concurrent.futures import ThreadPoolExecutor
import requests
import m3u8
import glob
import os
import time
import logging


logging.getLogger("urllib3").setLevel(logging.WARNING)


def AESDecrypt(cipher_text, key, iv):
    cipher_text = pad(data_to_pad=cipher_text, block_size=AES.block_size)
    aes = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
    cipher_text = aes.decrypt(cipher_text)
    # clear_text = unpad(padded_data=cipher_text, block_size=AES.block_size)
    return cipher_text


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}


def get_ts(url):
    try:
        response = requests.get(url, verify=False)
        response.raise_for_status()
        response.encoding = 'utf-8'
        return response.content
    except Exception as err:
        print(err)
        return b''


def save_ts(url, index):
    filename = os.path.join('./video', str(index).zfill(5) + '.ts')
    with open(filename, 'wb') as f:
        ts = get_ts(url)
        f.write(ts)
    print(filename + ' is ok!')


if __name__ == '__main__':
    playlist = m3u8.load(uri='./data/index.m3u8')

	#    ,  index             
    with ThreadPoolExecutor(max_workers=10) as pool:
        for index, seg in enumerate(playlist.segments):
            pool.submit(save_ts, seg.uri, index)

    key = get_ts(playlist.keys[-1].uri)

    files = glob.glob(os.path.join('./video', '*.ts'))
    for file in files:
        with open(file, 'rb') as fr, open('./video_de/baitoushan.mp4', 'ab') as fw:
            content = fr.read()
            encontent = AESDecrypt(content, key=key, iv=key)
            fw.write(encontent)
        print(file + ' is ok!')
  다운로드.ts파일 효 과 는 다음 과 같 습 니 다.
在这里插入图片描述
『8195』합성5.파일 효 과 는 다음 과 같 습 니 다.
在这里插入图片描述
在这里插入图片描述
5.종결 어
Musicer 소스 코드 창고
  Musicer음악 파충류 가 시 작 됐 습 니 다.지속 적 인 업데이트 중 입 니 다.스타 를 밟 으 러 오신 것 을 환영 합 니 다!d(R∇Q*)d
이상 은 Python 파충류 의 m3u 8 파일 에서 작은 동 영상 을 추출 하 는 정확 한 자세 에 대한 상세 한 내용 입 니 다.Python 에서 m3u 8 파일 의 작은 동 영상 을 추출 하 는 데 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기