치지직의 다시보기를 다운받는 용으로 기존의 명령어를 잘 사용하다가
ffmpeg -ss $starttime -to $endtime -i $URL -c copy $outputFileName
(위와 같은 형태가 기본)
근래에 다시보기가 라이브가 끝난 후 바로 업로드 되는 식으로 바뀌면서
m3u8을 읽어오는 방식에 변화가 생긴것인지
기존의 방식으로는 정상 동작을 안하는 상황이 생겼다
정확히는 원래의 다시보기 영상 방식
- 영상을 인코딩 다 해서 올라오는 방식 (거의 영상 길이만큼의 시간이 지난 후에 올라옴)
에서
- 영상을 인코딩 하는동안 다른 형식으로 다시보기 영상을 송출해준 뒤
인코딩이 끝나면 해당 영상을 대체하는 방식 (영상이 바로 올라옴)
로 바뀌었다는 느낌인데
저기서 인코딩이 끝나서 대체되기 전까지의 영상에 대해선 기존의 명령어가
정상적으로 먹히지 않는것이다.
이를 해결하기 위해 열심히 찾아봤지만 해결책은 간단했다.
명령어를 아래와 같이 수정해주면 끝이다.
ffmpeg -i $URL -ss $starttime -to $endtime -c copy $outputFileName
좀 살펴보다보니 전체 m3u8을 읽어온 뒤 이후 특정 지점을 잘라내는 기존 방식으론 오류가 생기고
m3u8을 읽어오다가 특정 지점에 도달했을 때 영상을 뽑아내는 방식으론 가능했던 것.
그 방법이 위처럼 -i의 순서를 바꿔 ffmpeg의 동작 순서를 조금 바꿔주는 것
영상이 연속적인 정보를 띄고있지 않으면 뭔가 정상 처리되지 않는건가? 아무튼
-----------------------------------------------------------------------------------------------------------------------
위에까지 고쳐서 잘 쓰던 와중 또 새로운 문제에 직면했다.
치지직 영상에 연령제한이 걸려있을 경우 인증정보를 전달해야 하는데
ffmpeg의 -header를 아무리 써도 제대로 동작을 안하는 것.
(물론 제대로 된 방법을 못찾아서 못한것일 수도 있다)
결국 차선책으로 발견한 방법이 yt-dlp의 --cookies 명령어를 쓰는 것이다.
물론 yt-dlp에도 --download-sections 나 --postprocessor-args 같은 영상을 잘라서 다운받는
명령어들이 존재하고 그냥 이거 써서 하면 되는거 아닌가? 싶지만
정확히 연령제한이 걸려있고, 위에서 문제되었던 막 라이브가 끝나 인코딩 되지 않은 영상의 경우
yt-dlp의 두 명령어로는 내가 명령어를 잘못 쓴 것인진 몰라도 정상적으로 동작하지 않았다.
그래서 어떤 방식으로 쓰느냐 하면 우선 치지직 메인에서 쿠키를 얻어낸다.
크롬 확장프로그램 EditthisCookies 같은걸 사용해 Netscape 형식으로 쿠키를 추출한다.
이후 쿠키 파일을 yt-dlp에 불러와서 해당 영상의 m3u8링크를 인증된 형태로 얻어온다.
yt-dlp --cookies cookie.txt -g URL
출력된 링크로
curl.exe -i "m3u8 URL"
를 해봐서 HTTP 200 ok가 나오면 정상적으로 인증이 되는 것인 듯 하다.
이후 이 링크를 가지고 위에서 썻던
ffmpeg -i $URL -ss $starttime -to $endtime -c copy $outputFileName
를 다시 해주면 정상적으로 동작하는 것을 확인할 수 있다.
'VIDEO' 카테고리의 다른 글
[FFMPEG] 영상 일부분만 다운받기(유튜브의 경우) (1) | 2024.06.03 |
---|---|
[FFMPEG] 영상 일부분만 다운받기 (0) | 2024.05.31 |
[프리미어 프로] 노래방 자막처럼 만들기 (2) | 2024.05.29 |