discord developer

ytdl-core로 높은 퀄리티의 디스코드 음악 스트리밍하기

yjlee06 2024. 4. 17. 15:54
반응형

이번 포스트에서는  
itag란 무엇인지
높은 퀄리티의 음악 스트리밍 데이터를 가져오기
위해서는 어떻게 이용
해야 할지

에 대해 알려드리겠습니다.

Itag란 무엇일까?

유튜브 스트리밍 포멧을 의미합니다.
쉽게 말해서 소리, 영상의 유무, 화질, 음질에 대한
정보를 담고 있습니다.

준수한 품질의 정보를 가진 itag를 사용한다면 더 좋은
음질과 안정성을 보장할수있습니다.

ytdl-core는 무엇일까?

유튜브 스트리밍 리소스를 가져와 스트리밍 하는
라이브러리입니다. (법적 문제 x) 해당 라이브러리를
이용하여 ReadableStream를 받아 스트리밍을 진행할
수 있으며 다운로드 또한 가능합니다.

해당 라이브러리를 이용하여 쾌적하게 스트리밍을 할려면 아래와 같이 설정해주는 것이 좋습니다.

  1. 비디오를 가져오지 않고 오디오만 가져온다.(스트리밍 filter 설정)
  2. 적절한 하이워터마크(streaming buffer size)를 설정한다. (스트리밍 옵션 설정)
  3. filter 설정에서 퀄리티나 포멧(mp4, opus 등등)을 설정한다.

 

그럼 좋은 퀄리티를 위해서는 itag만 다루면 되는건가?

위와같이 생각하실수도 있지만 실제로 좋은 itag를 찾기는 힘듬니다.

그 이유는 현재 존재하는 itag목록들중에서는 누락되거나 없어진 태그들이 존재하며
특정 태그에서는 오디오가 길게 늘어지는 현상도
보이기 때문이죠.

하지만 힘들뿐
찾는게 불가능한것은 아닙니다.
아래의 사이트에서 하나하나 시도해가며 좋은
포멧(itag)를 찾으실수있습니다.
https://github.com/fent/node-ytdl-core/blob/master/lib/formats.js

 

node-ytdl-core/lib/formats.js at master · fent/node-ytdl-core

YouTube video downloader in javascript. Contribute to fent/node-ytdl-core development by creating an account on GitHub.

github.com

아니면 아래의 정리된 사이트에서 지원여부를
확인해가며 찾을 수 있기도 합니다.
https://gist.github.com/AgentOak/34d47c65b1d28829bb17c24c04a0096f#dash-audio

 

Youtube Format IDs

Youtube Format IDs. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

itag외 다른 방법이 있을까?

바로 streaming option 중  filter에서 여러가지 옵션을 적용해서 오디오 퀄리티를 조정하는 방법인데요.

filter 인자 에서는 다양한 옵션이 존재하는데요.

 

아래와 같은 옵션은 itag 대용으로 사용할 수 있습니다!

audioQuality 추천: AUDIO_QUALITY_MEDIUM,
AUDIO_QUALITY_LOW
준수한 오디오 품질을 위해 설정
hasVideo false 비디오 데이터를 받지않아
효율적으로 음악 스트리밍
재생 가능
hasAudio true 오디오 스트리밍 필요
container 추천:  mp4
flv, 3gp, mp4, webm, ts
webm은 오디오가 늘어지는 버그가 발생함

또한 mp4가 많이 사용되며
안정적임

 

아래는 필수적인 옵션입니다!

highWaterMark: 1 << 62,
liveBuffer: 1 << 62,
dlChunkSize: 0,
requestOptions: {
 maxRedirections: 5
}

해당 옵션은 음악의 재생시간이 일정길이 이상으로 되었을때 Error: aborted 오류가 발생하였고

위의 코드를 사용한 결과 1시간 이상의 영상에서도 중단되는 오류를 발견이 되지 않았습니다.

 

 

코드 정리


const stream = ytdl(url, {
 agent: agent,
 filter: format =>
 format.audioQuality == "AUDIO_QUALITY_MEDIUM" &&
 format.hasVideo == false &&
 format.hasAudio == true &&	
 format.container == "mp4",
 highWaterMark: 1 << 62,
 liveBuffer: 1 << 62,
 dlChunkSize: 0,
 requestOptions: {
  maxRedirections: 5
 }
})


agent인자에 대해서는 아래의 블로그를 참조해주세요!
디스코드 레니 봇 개발 일지_(ytdl-core 비트레이트 높이기 및 버그 고치기 ) (tistory.com)

 

디스코드 레니 봇 개발 일지_(ytdl-core 비트레이트 높이기 및 버그 고치기 )

지금까지는 ytdl-core를 사용하면서 음악봇을 운영했지만 해당 라이브러리는 버그가 많다..;; 대표적인 건 ECONNRESET, 429, 403 또는 스트리밍 멈춤, 렉, 불안정함... 아주 환장하겠다. (이래서.. 라바링

devlany.tistory.com