글쓰는 개발자

유튜브 영상 추출 다운로드 프로그램 개발 본문

IT 서비스 제작과정/개발

유튜브 영상 추출 다운로드 프로그램 개발

세가사 2024. 4. 30. 01:02
반응형

https://gran007.tistory.com/entry/%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EC%98%81%EC%83%81-%EC%B6%94%EC%B6%9C-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8

 

유튜브 영상 추출 다운로드 프로그램

프로젝트 동기나는 유튜브 타로 제너럴 리딩을 좋아한다. 제너럴 리딩이란 유튜브 타로영상을 올리는 타로리더들이 1-4 까지의 랜덤 카드배열을 놓고 그걸 순서대로 펼쳐서 해석해 주고 구독자

gran007.tistory.com

유튜브 영상 추출 다운로드 프로그램을 구현해 보자

 

pycharm을 실행해서 python 파일을 하나 만들고 샘플 코드를 작성한다.

from pytube import YouTube


def download_video(video_url, download_path):
    yt = YouTube(video_url)
    yt.streams.filter(progressive=True, file_extension='mp4')\
        .first()\
        .download(download_path)


if __name__ == '__main__':
    url = '유튜브_주소'
    path = '소스영상_저장폴더'
    download_video(url, path)

 

터미널에서 아래 명령으로 pytube를 설치한다.

pip install pytube

 

이제 프로그램을 실행한다. 한번에 잘 되면 좋겠지만 다음과 같은 에러가 발생한다.

 

유튜브 나이 정책을 위반해서 다운로드가 안되는 것 같다. 인터넷에 검색해보니 pytube 라이브러리에 메인에 bypass_age_gate에 client 옵션을 변경해줘야 한다고 한다.

위 client를 Android로 변경한다.

 

잘 되려나 싶었는데 이번에는 400 에러가 나기 시작했다. 또 검색해 보니 pytube 라이브러리에 innertube.py 파일내에 Android 항목에 clientVersion을 수정해 주어야 한다는 것 같다.

 

 

해당 파일을 수정해 주니 다운로드는 잘된다. 근데 최저 화질 다운로드는 잘되는데 resolution을 720p나 1080p로 바꾸니 다운로드 중에 멈춰버리는 현상이 발생한다. 무언가 문제가 많은 라이브러리같다.

 

일단 중요한것은 낮은 화질이라도 다운로드를 받는 것이기 때문에 이제 파일 자르기를 진행하자.

 

먼저 ffmpeg 프로그램이 필요하다. 해당 사이트에가서 다운을 받자.

 

Download FFmpeg

If you find FFmpeg useful, you are welcome to contribute by donating. More downloading options Git Repositories Since FFmpeg is developed with Git, multiple repositories from developers and groups of developers are available. Release Verification All FFmpe

ffmpeg.org

 

윈도우라면 Windows build for gyan.dev에 가서 ffmpeg-release-full.7z을 받아서 압축을 풀면 된다.

 

이제 ffmpeg를 설치한 폴더에 가서 실제로 영상 자르기가 잘 되는지 다음 명령으로 확인한다.

ffmpeg -i <원본소스.mp4> -ss <시작시간> -to <종료시간> -vcodec copy -acodec copy <편집본.mp4>

 

파일이 잘 잘리는걸 확인했으면 이제 python에서 해당 프로그램을 실행할수 있게 하자. 원본의 path와 파일이름이 필요하니 이를 추출할수 있는 return 값을 함수에 추가하고 ffmpeg를 실행할수 있도록 subprocess.run 명령을 추가해주자.

from pytube import YouTube
import subprocess


def download_video(video_url, download_path):
    yt = YouTube(video_url)
    yt.streams.filter(progressive=True, file_extension='mp4')\
        .first()\
        .download(download_path)
    return yt.streams.first().default_filename


ffmpeg_file_path = '<ffmpeg파일위치>'

if __name__ == '__main__':
    url = '<유튜브URL>'
    path_origin = '<원본소스path>'
    path_edit = '<편집소스path>'
    start_time = '<편집시작시간 ex)0:13:35>'
    end_time = '<편집종료시간 ex)0:28:07>'
    filename = download_video(url, path_origin)
    subprocess.run(f'{ffmpeg_file_path} -i "{path_origin}/{filename}" -ss {start_time} -to {end_time} -vcodec copy -acodec copy "{path_edit}/{filename}"')

 

영상이 아주 잘 편집되어있다.

반응형