오늘 소개할 내용은 트위치 동영상을 다운로드 받는 방법입니다. 많은 외부 사이트들 예를들면,
Download Twitch videos & clips. Twitch.tv downloader & converter online
More about Untwitch.com This site was born out of a need, and now look at us, we are strong and ready to help our fellow twitchers to untwitch and get on with their lives without too much of data transfered in the process. We have also thought 20hr videos
untwitch.com
같은 사이트들이 사실 트위치 클립이나 다시보기 영상등의 영상 주소,
클립의 경우: https://www.twitch.tv/riotgames/clip/DignifiedTenuousBubbleteaANELE-cUlxWsXpJHhjDy0j?filter=clips&range=7d&sort=time 와 같이 /clip의 주소형식을 가지는 것들
다시보기의 경우: https://www.twitch.tv/videos/1489739133 와 같이 videos 형식을 가지는 것들
을 다운로드 하는 기능을 제공합니다. 또한 트위치의 기본적인 클립 툴의 경우는 최대 1분까지 일부 동영상을 말그대로 Clip 할 수 있는 기능을 지닙니다.
하지만 9시간의 전체 방송 영상 중 일부 30분만을 다운로드 받고 싶을 때, 전체 동영상을 다운받고 30분을 자르는 것은 비효율적인 행동입니다. 클립의 경우에도 30분 정도의 시간은 지원하지 않기 때문에 이런 경우에 동영상을 다운받는 방법을 소개하고자 글을 씁니다.
먼저 이 글은 구독자 전용이 아닌 영상을 기준으로 작성되었기 때문에, 구독자 전용인 동영상을 다운받기 위해서는 로그인 세션정보가 좀 더 필요할 것으로 예상됩니다.
예시로 Riot Games 채널을 가져왔는데 개발자도구를 F12를 눌러서 켜고, 네트워크 탭에서 m3u8 항목으로 검색하게 되면(새로 로드하기 위해서는 "Ctrl + R"을 통한 새로고침이 필요함) 위와 같이 여러개의 파일들이 네트워크를 통해서 전송되었음을 알 수 있습니다. 그 중에서 "/chunked" 주소를 포함하고 있는 것이 트위치 동영상 설정에서 "source"라고 불리는 화질의 영상을 포함하고 있습니다.
이 때, 이 m3u8 파일을 다운로드받아 보게 되면,
위와 같은 구조를 지니게 되는데, 기본적으로 동영상이 .ts 파일의 형식을 갖고 있습니다.
어떤 장점이 있는 지에 대해서는 깊이 알아보지 않았지만 뇌피셜로 생각해보면, 클리핑이나 동영상을 앞뒤로 당기는 데에 있어서 장점을 지니지 않았을까 합니다.
첫 인덱스 번호인 "0.ts" 파일의 경우는 첫 0초부터 10초까지의 영상, "1.ts" 파일의 경우는 첫 10초부터 20초까지의 영상의 정보를 포함하고 있습니다.
따라서, 우리가 다운로드 받고자 하는 시간을 알고있다면 클라우드 서버에 다운로드 요청을 보내야할 항목의 인덱스번호를 계산할 수 있습니다.
def hms_to_idx(hms_string):
h, m, s, *rest = map(int, hms_string.split(":"))
return (h * 3600 + m * 60 + s) // 10
다운로드 받고자 하는 시간이 1시간 39분 50초부터 2시간 40분 40초 까지라고 하면,
1:39:50 - 2:40:40 같은 입력형식을 인덱스번호로 바꾸어주는 함수는 위와 같습니다.
또한, 해당 인덱스 번호를 갖는 영상은 해당 클라우드 주소 "~.../chunked/0.ts" 같은 형식으로 요청할 수 있으므로, 파이썬의 라이브러리 requests 와 progress bar를 명시하고 싶다면 tqdm을 활용하여 다음과 같은 스크립트를 작성할 수 있습니다.
import requests as re
from tqdm import tqdm
import subprocess
def hms_to_idx(hms_string):
h, m, s, *rest = map(int, hms_string.split(":"))
return (h * 3600 + m * 60 + s) // 10
url = input("Input url: ")
last = url.rfind("index")
url = url[:last]
start_time = input("Input start time: ")
end_time = input("Input end time: ")
title = input("Input the title: ")
start_idx = hms_to_idx(start_time)
end_idx = hms_to_idx(end_time)
print(f'Start index: {start_idx}, End index: {end_idx}')
with open(f'{title}.ts', 'ab') as f:
for idx in tqdm(range(start_idx, end_idx)):
r = re.get(f'{url}{idx}.ts')
if r.status_code != 200:
r = re.get(f'{url}{idx}-muted.ts')
f.write(r.content)
여기서 한 가지 주의해야할 점은 아래의 "status_code" 검사 부분인데, m3u8 파일을 자세히 들여다보면 알겠지만 트위치에서 저작권과 관련하여 매 영상마다 사운드에 대한 검사를 하기 때문에 저작권에 위배되는 노래가 있을 경우는 "279-muted.ts"와 같이 해당 부분을 mute하여 파일 변환 작업이 진행됩니다. 만약 원본 노래와 같이 다운로드 받고 싶을 경우에는 해당 변환이 진행되기 전에 라이브 진행중인 방송의 다시보기를 열람하여 빠르게 다운로드 받는 방법이 가장 합리적으로 보입니다.
위의 간단한 파이썬 스크립트를 통해서 동영상 일부를 다운로드 받으실 수 있습니다.
추가적인 코멘트를 하나 하자면, 사실 third party 동영상 다운로드를 지원하는 사이트들은 다운로드를 진행하면 기본적으로 mp4 파일을 건네주지만, 우리가 수동으로 이런 작업을 하기 위해서는 스크립트를 통해서 다운로드가 완료된 파일을 ffmpeg
FFmpeg
Converting video and audio has never been so easy. $ ffmpeg -i input.mp4 output.avi News January 17th, 2022, FFmpeg 5.0 "Lorentz" FFmpeg 5.0 "Lorentz", a new major release, is now available! For this long-overdue release, a major effort underwent to
ffmpeg.org
와 같은 소프트웨어로 인코딩해줄 필요가 있습니다. ts 파일에 비해서는 용량도 매우 크게 줄기 때문에 장기적인 저장을 위해서는 이런 소프트웨어의 도움을 받을 필요가 있습니다. 하지만 인코딩 속도 면에서 Third party 사이트들과 큰 차이가 나게 되는데, 이에 대해서는 좀 더 알아보고 보충할 기회가 있으면 좋겠습니다.
'게임, 트위치' 카테고리의 다른 글
아프리카tv 동영상 다운로드 (0) | 2023.03.09 |
---|---|
아프리카 댓글 하이라이트 링크 만들기 (0) | 2022.12.23 |
트위치 포인트 자동 파밍 (Twitch point miner) (0) | 2022.06.15 |
Blackcomb 마우스 커서 (0) | 2022.05.24 |
2021 LCK Spring 영혼용 통계 (0) | 2022.05.06 |