치지직의 다시보기를 다운받는 용으로 기존의 명령어를 잘 사용하다가

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

 

를 다시 해주면 정상적으로 동작하는 것을 확인할 수 있다.

반응형

이전에 FFMPEG를 이용해 URL을 받아서 미리 영상을 잘라낸 뒤

원하는 부분만 다운받는 방법을 찾아봤었는데

유튜브의 경우는 조금 더 복잡해서 따로 기록해둔다

 

우선 이전에 사용했던 yt-dlp를 이용해 원하는 유튜브 영상의 정보를 가져온다

yt-dlp -g [영상 링크]

 

그러면 주소값이 두개가 출력되는걸 볼 수 있다

예시

왜 두개인가 하면 영상파일과 음성파일이 분리되어 있기 때문이다

위에가 영상 링크이고 아래가 음성 링크이다

 

이보다 더 자세하게 링크를 가져오고 싶으면 아래의 명령어를 쓴다

yt-dlp -F [영상 링크]

 

그러면 해당 영상의 각 해상도별 영상 파일의 ID값을 포함한 정보 등이 나온다

예시2

audio only와 video only에서 원하는 해상도와 비트레이트를 찾아 왼쪽의 ID 값을 확인한 뒤

아래처럼 입력해주면 원하는 화질과 음질로 다운받을 수 있다.

yt-dlp -f [ID]+[ID] [URL]

#예시 1280x720 30fpds mp4 영상과 129kbps 음성을 합친 뒤 출력
yt-dlp -f 136+140 https://youtu.be/JL_GJShS4fU?si=jYcpT303JjgxFOca

 

하지만 내가 원하는건 해당 링크를 가져오는것이니 아래처럼 입력해준다.

yt-dlp -f [ID]+[ID] [URL] --get-url

 

그 후 얻어낸 링크로 ffmpeg에 적용하기 전에 문제가 있다.

링크에 보면 특수문자 &가 여러번 들어간게 보이는데 링크에 이 문자가 포함되어 있으면

실행중 에러를 뱉어낸다.

그러니 미리 &를 찾아 모두 "&"로 바꿔준다.

vscode같이 찾아서 모두변환이 있는 프로그램을 쓰면 편하다

 

이제 ffmpeg에서 아래와 같이 써준다.

ffmpeg -ss [시작 시간] -to [끝나는 시간] -i [영상 링크] -ss [시작 시간] -to [끝나는 시간] -i [음성 링크] -c copy -map 0:v:0 -map 1:a:0 output.mp4

 

 

각 링크의 파일을 잘라낸 뒤 -c copy로 재인코딩 없이 복사 한 후

-map으로 첫번째 파일의 비디오 스트림과 두번째 파일의 오디오 스트림을 출력파일에 매핑하는 것이다.

 

반응형

짤막한 클립영상을 만들려고 다시보기 영상들을 통째로 다운받고 잘라서 편집하다보니

하나에 20~30GB는 우습게 넘기는 크기 영상들을 다운받아서 작업을 했는데

이게 하드 수명에도 그닥 좋지 않을거같고 해서 다른 방법을 찾아봤다.

 

기존에 영상을 잘라내는데에 쓰던 FFMPEG 명령어를 조금 손봐서 Input 영상을 url로 대체하면

가능하지 않을까 시도했다.

 

#$starttime부터 $endtime까지의 영상으로 잘라내는 명령어
ffmpeg -i video.mp4 -ss $starttime -to $endtime -vcodec copy -acodec copy output.mp4

 

 

#Input video를 다운받을 영상의 URL로 바꿔줌
ffmpeg -i [URL] -ss $starttime -to $endtime -vcodec copy -acodec copy output.mp4

 

하지만 이렇게 바꿔서 시도해보니 아래처럼 0 frame에서 작업이 멈춘 상태로 진행되지 않았다.

이 상태에서 멈춰있다

 

그래서 다른방법이 있을까 하고 찾아봤지만 결과적으론 그냥 명령어 순서의 문제였다.

아래와 같이 해주면 정상 작동한다.

ffmpeg -ss $starttime -to $endtime -i [URL] -c copy output.mp4

 


왜 그냥 갖고있던 영상을 다룰때와 URL로 받아와서 다룰때 명령어 순서에 차이가 생기는지는 모르겠다.

 

 


치지직에서 해당 다시보기 영상의 URL을 가져오는 방법

 

해당 영상에 들어가 f12로 개발자모드를 키고 Network탭에서 m3u8을 검색하면 아래와 같이 나온다

결과들을 눌러보면 위처럼 key=가 들어간 값을 가리키는게 있다

거기서 preview로 들어가면

이렇게 BaseURL과 m3u8 링크를 얻을 수 있다.

 

이 중 BaseURL을 써야 정상작동 한다.

 

---

 

이 방법이 복잡하면 그냥 yt-dlp를 사용하는 방법도 있다.

https://github.com/yt-dlp/yt-dlp

 

GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader

A feature-rich command-line audio/video downloader - yt-dlp/yt-dlp

github.com

링크에 들어가서

윈도우 기준 yt-dlp.exe를 다운받아 ffmpeg와 같은 폴더에 넣은 뒤 명령 프롬프트에서 해당 폴더로 이동하고

yt-dlp -g [영상링크]

위 명령어를 쓰면 쉽게 BaseURL을 받아올 수 있다.

예시

 

반응형

비디오 효과 중 자르기 효과를 사용한다.

 

자르기

우선 트랙에 색을 입힌 자막과 그렇지 않은 자막을 겹치게 만들어 준다.

색을 입힌 자막이 위에 가도록 하면 이렇게 색을 입힌 자막만 보인다

색을 입힌 자막에 자르기 효과를 넣고 자르기 효과 중 오른쪽을 100%로 설정한다.

이미지와 같이 설정

그 후 노래에 맞춰 키프레임마다 수치를 조절해 주면 된다.

예를들어 위에처럼 가나다라마바사 라는 가사에서 가나다까지 말했다면

그곳에 키프레임을 두고 수치를 조절해 가나다까지 색이 입혀지도록 조절한다.

 

주의할 부분은 자르기 효과가 효과를 입힌 자막 기준이 아니라

화면 전체를 기준으로 100~0%를 나누는 듯 하기에

자막 위치를 오른쪽으로 이동시키면 100%에서 바로 색이 입혀지지 않을 수 있다.

반응형

+ Recent posts