Skip to content

Instantly share code, notes, and snippets.

@curioustorvald
Last active February 27, 2024 15:00
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save curioustorvald/777dd08ff8b2cf18253dffc0ab14f47c to your computer and use it in GitHub Desktop.
Save curioustorvald/777dd08ff8b2cf18253dffc0ab14f47c to your computer and use it in GitHub Desktop.
How to record twitch live streaming PROPERLY

송출이 불안정한 스트리머의 방송을 최소한의 딜레이로 녹화하도록 만들어진 녹화 스크립트입니다. 호스팅 채널을 녹화하지 않고, TS파일을 직접 저장합니다.

이 스크립트는 24/7 상시감시 및 녹화를 위해 준비된 스크립트이고 설정 과정에서 약간의 프로그래밍적 지식이 필요합니다. 단타성 녹화를 원한다면 더 단순한 거 찾아다 쓰십쇼.

치지직용 스크립트를 테스트하고 있습니다. 여러분의 많은 기여가 필요합니다 🙏🙏

세팅하기 전에

윈도에서도 작동은 하겠지만, 진짜 봇을 구축하려면 이 글의 작성자는 리눅스를 사용하는 걸 추천합니다. 리눅스를 쓰는 이유는, 적어도 얘는 업데이트 있다고 지멋대로 재부팅하지는 않으니까요 (대충 트위치 카파 콘)

의존성 해결

python3와 streamlink가 설치되어야 합니다.

  1. 리눅스: 터미널 창에서 sudo apt install python3 (혹은 자신의 리눅스 배포판에 맞는 명령어) 를 실행해 파이썬3을 설치하세요. 윈도: 이 주소로 이동해 파이썬3를 설치하세요.
  2. PIP을 사용해 pip install --user streamlink를 실행하여 streamlink를 설치해주세요. (이대로 하지 않으면 엄청 구버전이 설치됩니다)
  3. 터미널 창에서 streamlink --version을 입력해 설치된 버전을 확인해주세요. 4.2.0 이상 버전이어야 합니다!

트위치 API를 사용하기 위한 Client ID 취득

트위치 API의 정책 변경으로 인해 OAuth 토큰이 필요하고, 이를 위해 Client ID를 발급받아야 합니다.

  1. 녹화 스크립트 소스코드를 다운받아 적당한 곳에 저장합니다.
  2. 트위치 개발자 콘솔에 접속해 앱을 먼저 등록합니다. (녹화 스크립트도 트위치의 시점에서는 제삼자 앱이기 때문에 토큰 발급을 위해 등록이 필요합니다) Name란에는 twitch라는 단어를 포함하지 않는 적당한 이름 (예: my_streaming_tool_test), OAuth Redirect URLs란에는 http://localhost, Category는 적당한 것을 선택하고 MrDestructoid이(가) 아님을 인증한 다음 Create를 눌러주세요
  3. Developer Applications 하에 방금 등록한 앱 이름이 있을 것입니다. 우측의 Manage를 누릅니다.
  4. Client ID를 복사해 녹화 스크립트의 TWITCH_API_CLIENT_ID에 붙여넣기해 주세요.
  5. New Secret 버튼을 눌러 Client Secret을 발급받아 녹화 스크립트의 TWITCH_API_CLIENT_SECRET에 붙여넣기해 주세요.
  6. 수정된 녹화 스크립트를 저장해 주세요.

여기서 발급된 Client ID와 Client Secret은 개인에게 발급된 비밀번호와 같은 것으로 타인과 공유하여서는 안 됩니다.

녹화 스크립트 사용자화

  • RECORDING_SAVE_ROOT_DIR: 녹화본이 저장되는 루트 디렉토리를 지정합니다. NAS에서 구동시키는 경우 /srv/nfs/twitchrecords 정도가 적당하겠지요. 녹화 스크립트가 저장돼있는 디렉토리를 사용하려면 ./를 입력해주세요.
  • FILE_NAME_FORMATTIME_FORMAT: 녹화되는 파일의 이름 형식을 지정합니다. 기본값은 이전 버전 녹화 스크립트와 동일하게 설정돼있습니다.

녹화 세팅

python 녹화스크립트.py -u 스트리머_아이디

녹화스크립트.py에는 저장된 녹화스크립트의 파일명을 입력하고 (.py는 떼면 안 됩니다!) 스트리머_아이디에는 녹화하고자 하는 스트리머의 이름이 아닌 스트리머의 트위치 아이디를 입력합니다. (예: 똘똘똘이_jungtaejune)

위의 명령어를 시스템이 부팅되면 자동으로 실행되도록 합니다. 윈도 사용자는 윈도용 bat 파일을 만들어 시작프로그램에 등록하면 되고, 리눅스 사용자는 사용하는 배포판에 맞게 설정해주세요. (.bashrc에 등록하기보다는 자신이 사용하는 데스크탑 환경 — KDE라던지 GNOME이라던지 — 에서 제공하는 방법을 사용하십시오)

위와 같이 세팅한 후 재부팅하면 자동으로 녹화가 이루어질 겁니다.

후처리

Streamlink를 업그레이드하려면 터미널 창에서 pip install --user --upgrade streamlink를 실행하여 주세요.

그냥 다시보기만 할 때는 후처리가 필요 없습니다. 그냥 TS파일 그대로 재생해서 보면 됩니다.

-트-가 -트-해서 (혹은 야방이어서) 녹화가 2개 이상으로 조각날 때가 있습니다. 그럴 때는 TS파일을 그냥 합쳐버리면 됩니다: cat 영상조각1.ts 영상조각2.ts 영상조각3.ts ... > 온전한영상.ts

이 글은 다음의 위치에서도 볼 수 있습니다:

자주 묻는 질문

  • ImportError: no module named requests
    • 터미널 창에서 pip install --user requests를 사용해 모듈을 설치해 주세요.
  • unrecognized arguments: twitch.tv/
    • 아래의 알려진 버그 — Windows에서 Streamlink 2.x를 3.x로 업그레이드 시 주의할 점을 봐 주세요.

트위치 한국발 접속의 720p 제한 우회하기

녹화 스크립트를 이 코드로 바꾸어 시도해 보세요. (외부 API를 사용해 일본 서버에서 m3u8 링크를 받아와서 작동합니다. Yoon0618님 제공)

알려진 버그

Windows에서 Streamlink 2.x를 3.x로 업그레이드 시 주의할 점

Streamlink가 2.x버전에서 3.0으로 업그레이드 되면서 기본설정이 바뀌었는데, 업그레이드 후 rtmp-rtmpdump 오류 혹은 unrecognized arguments: twitch.tv/ 오류가 발생할 수 있습니다. 이런 경우에는 Streamlink를 업그레이드한 다음, Streamlink의 설정파일을 만져줘야 합니다.

윈도키+R → %APPDATA% 입력후 엔터 → streamlink 폴더 → config 파일 메모장으로 열기 → rtmp-rtmpdump가 있는 줄 삭제 (한 개가 아닙니다!)

자세한 정보는 아래에서 확인할 수 있습니다:

스트리머가 설정한 최고 화질로 녹화가 이루어지지 않는 경우

Twitch 쪽에서 화질 옵션을 이상한 형식으로 반환하는 문제가 있기 때문에 간헐적으로 1080p로 송출중인 방송이 720p로 녹화되는 경우가 간혹 있습니다. 이러한 경우에는 Streamlink를 4.2.0 이상 버전으로 업데이트해 주세요.

자세한 정보는 아래에서 확인할 수 있습니다:

@Helix-hy
Copy link

@meamde 제가 진짜 컴퓨터 게임만 하고 이런걸 안해서 전혀 몰라서 개고생 하고 있었는데 써주신글 읽다가 주석처리 라는 글을보고 해결 했습니다 ! 구글링 하다보니 213번째줄에 이것저것 추가하면 된다 해서 했었는데 안되더라구요 그래서 질문하고 혼자 몇일을 찾아보고 이것저것 개고생 했었는데 드디어 해결 했습니다. c언어같은걸 전혀 모르다보니 # 이거 있으면 주석처리돼서 인식이 안된다 이걸 몰라서 고생했던거였네요 .. 본문에 있는 녹화 스크립트 소스코드 저거 받아서 무작정 따라 했던거였는데 저기 213번째줄에 # 으로 주석처리 되어있고 215줄이 주석처리가 안되어있어서 본문 대로라면 215번째 줄에다가 문구를 추가 했어야했는데 주석처리 되어있는 213번째 줄에 계속 수정만 해댔으니 항상 광고가 나왔었던거같아요ㅎㅎ 덕분에 하나 배워갑니다 그리고 저도 1080p로 녹화하려고 openvpn써서 하고있는데 다중게이트웨이랑 다른방법인지는 모르겠지만 또 해볼게 생긴거 같네요 ㅋㅋ 도와주셔서 감사합니다

@caca0408
Copy link

안녕하세요, 윗분과 마찬가지로 213번째줄을 수정해 광고 제거를 하려고 스크립트 수정을 하여 녹화 중 입니다. 그런데 이전에는 없던 문제가 발생하여 질문 드립니다. 이전에는 60프레임으로 녹화 되었는데, 저 보라색 화면이 뜬 뒤로는 (=213번줄 수정 후) 1000프레임으로 녹화되어 해결 방법을 모르겠어서 댓글 남깁니다. 도와주시면 감사하겠습니다 :)

@Helix-hy
Copy link

@caca0408 저도 따라하기만 한거라 잘은 모르지만 전 213번째줄을 #으로 주석처리해서 안쓰고 위에 meamde님이 써주신 ret = 저 코드를 215번째줄에 그대로 붙여넣기를 해서 사용하고 있습니다.

@Helix-hy
Copy link

@meamde 따라해서 저번에 있던 광고 이미지는 없어졌는데 이번에 녹화한거 확인해보니까 중간에 광고들어가는부분이 되면 광고는 안나오는데 화면이 멈추면서 소리가 광고가 끝난후 인거같은부분부터 소리가 나고 조금있으면 영상 빨리감기 한것처럼 되면서 싱크가 맞춰지는데 혹시 토큰쓰면 이런현상도 없앨수있나요 ? 구독 되어있는데도 이런현상이 있더라구요 만약 토큰을 써야한다면 어디부분에 토큰을 써야할까요 ?

@Scorps0530
Copy link

Scorps0530 commented Jun 1, 2023

2023-06-01 22:50:05,470 INFO root The video will be saved on 파일위치
[cli][info] Found matching plugin twitch for URL twitch.tv/스트리머이름
error: No playable streams found on this URL: twitch.tv/스트리머이름
2023-06-01 22:50:06,470 WARNING root Unexpected error. Will try again in 5 seconds.
이것처럼 오류가 뜨는데 왜 이럴까요?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment