파이썬 프로젝트 강좌(초급)/유튜브 동영상 다운로드

유튜브 동영상 다운로드 - 1.유튜브 영상 1개 다운로드

파기차차 2024. 7. 6. 17:26
728x90
반응형
SMALL

ㅁ 개요

 

O 프로젝트 소개

 

 

 - 이번 글은 이전글([파이썬 프로젝트 강좌(초급)/유튜브 동영상 다운로드] - 유튜브 동영상 다운로드 - 0.소개

)에 이은 2번째 글로 유튜브 영상 1개를 다운로드 받는 방법에 대하여 알아 보겠습니다.

 

 

 

 

O 완성된 프로그램 실행 화면

 

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

1. 1.py 실행 시 에러 없이 잘 실행된 것을 볼 수 있습니다.

 

 

아래 폴더에 가서 확인해 보니 "파이썬 텍스트 계산기 만들기.mp4" 영상이 잘 받아졌습니다.

 

 

실제 영상 파일을 더블클릭하여 실행해 보니 실행이 잘되고, 소리도 잘 나오는데, 화질이 너무 구립(?)니다.

우리는 다운로드 받은 파일의 소리와 좋은 화질을 원하므로 추가 개선이 필요합니다.

 

 

 

 

 

 

 

 

 

2. 1.py의 코드를 수정한 2.py를 실행하면 아래와 같이 다운로드 과정을 보여주고, 1.py 보다 좀 더 친절하고, 자세한 내용과 함께 다운로드가 완료되었습니다.

 

 

 

 

폴더에 가서 확인해 보니 역시나 영상이 잘 받아졌습니다.

 

 

 

실제 영상파일을 실행해 보면 아래와 같이 화질이 많이 좋아졌는데, 그런데 소리가 나오지 않습니다.

이거 다시 소스를 수정해야 겠습니다.

 

 

 

3. 화질 + 소리가 개선되도록 만든 3.py를 실행하니 이전과 다른게 실행 많은 내용이 출력되고 시간도 조금 더 소요되었으나, 다행히 잘 다운로드 되었습니다.

 

 

 

그런데, 다운로드 된 파일이 3개가 있는데, 오디오 파일, 비디오 파일, 그리고 아웃풋 파일입니다.

이 것은 ffmpeg를 이용하여 고화질로 다운로드시 음성과 화면을 분리하여 다운로드 받은 후 음성+화질을 합치는 과정을 거치기 때문입니다.(자세한 내용은 아래 소스 부분 참고)

 

소리 및 영상화질이 좋은지 실제 output_720p.mp4 파일을 실행해 봅니다.

 

 

 

 

아래 영상처럼 화질도 좋고, 소리도 잘 나오고 있습니다.

 

 

 

 

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

소스파일 : 1.py

from pytube import YouTube
from pytube.cli import on_progress


link = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

# link=input('enter url:')
yt=YouTube(link,on_progress_callback=on_progress) # on_progress_callback 으로 on_progress를 지정하거나, 사용자 정의 함수를 지정할 수 있음

videos=yt.streams.first() # 첫번째 스트림을 가져옴
videos.download()
print("################# 다운로드 완료 #############################")


###################
# 화질 안좋음
###################

 

 

소스파일 : 2.py

from pytube import YouTube
# from pytube.cli import on_progress #this module contains the built in progress bar.


def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')
#
url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

# yt = YouTube(url, on_progress_callback=on_progress)
yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download()

# yt = YouTube(url, on_progress_callback=on_progress)
# stream = yt.streams.get_highest_resolution()  # Get the highest resolution progressive stream
# stream.download()


###################
# 소리 안나옴
###################

 

 

 

 

소스파일 : 3.py

from pytube import YouTube
import subprocess

def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size / 1024) / 1024
    totalsz = round(totalsz, 1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion, 2)

    print(f'Download Progress: {percentage_of_completion}%, Total Size: {totalsz} MB, Downloaded: {dwnd} MB, Remaining: {remain} MB')

url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'
yt = YouTube(url, on_progress_callback=on_progress)

# Get the 720p video stream
video_stream = yt.streams.filter(res="720p", mime_type="video/mp4").first()
# video_stream = yt.streams.filter(res="1080p", mime_type="video/mp4").first()
# Get the audio stream
audio_stream = yt.streams.filter(only_audio=True, mime_type="audio/mp4").first()

video_file = 'video.mp4'
audio_file = 'audio.mp4'

print("Downloading video...")
video_stream.download(filename=video_file)
print("Downloading audio...")
audio_stream.download(filename=audio_file)

output_file = 'output_720p.mp4'

print("Merging video and audio...")
# Merge video and audio using ffmpeg
subprocess.run(['ffmpeg', '-i', video_file, '-i', audio_file, '-c:v', 'copy', '-c:a', 'aac', output_file])

print(f'Download and merge complete. File saved as {output_file}')


###################
# ffmpeg를 사용하여 비디오+음성 결합 후 성공
###################

 

 

 

 

O 소스 실행 방법

 
 
 - 소스파일 다운로드 후 cmd 또는 파워쉘 등에서 아래와 같이 실행하시기 바랍니다.
 
 > python 1.py
 > python 2.py
 > python 3.py
 

 

 


 
 

O 주요 내용

 

아래 소스코드에 대한 간략하게 주요 내용만 설명하겠습니다.

 

 

소스 파일 : 1.py

유튜브 영상을 가장 간단하게 받을 수 있는 코드 입니다.

line 1~2 : pytube 모듈을 이용하여 유튜브 영상을 다운로드 할 것이기 때문에 관련 모듈을 임포트 해줍니다.

 

line 5 : 다운로드 받을 영상의 주소를 link 변수에 넣어 줍니다.

 

line 8 : 기본적으로 YouTube 모듈을 사용하여 아래와 같은 형식으로 유튜브 주소와, 콜백 함수를 지정해 줍니다. 콜백함수는 디폴트로 on_progress 또는 사용자 정의함수를 만들 수도 있습니다.

yt=YouTube(link,on_progress_callback=on_progress)

 

line 17~18 : yt객체의 스트림 중 첫번째 스트림을 가져와서 다운로드 합니다.

 

문제점 : 화질이 좋지 않음

 

 

 

 

소스 파일 : 2.py

1.py와 다른 주요 내용만 설명합니다.

 

line 5~15 : 콜백 함수(on_progress)를 사용자 정의 함수로 만들고, 다운로드 시 다운로드 진행 상황 등 자세한 내용을 보여줄 수 있도록 만들었습니다.

 

line 23 : YouTube 모듈 사용 시 아래와 같이 스트림에 필터(720p)를 주면 화질을 개선할 수 있습니다.

yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download()

 

문제점 : 소리가 나지 않음

 

 

 

 

 

소스 파일 : 3.py

3.py 소스코드는 기본적으로 오디오와 비디오 파일을 각각 다운로드 한 후 합치는 과정을 거치며, 이를 위해 ffmpeg를 사용합니다.(ffmpeg 환경설정하는 방법은 아래 url 참고)

 

ffmpeg 환경설정 하는 방법

https://pagichacha.tistory.com/161

 

[프로젝트]chatGPT3.5로 자동으로 책 요약 후 아바타 숏츠만들기 > 5.1 ffmpeg로 영상을 작게 만들기

ㅁ 개요 O 프로그램 소개 이번글은 이전글([프로젝트]chatGPT3.5로 자동으로 책 요약 후 아바타 숏츠만들기 - 4.이미지를 말하는 동영상으로 만들고 로컬에 저장하기 > 4.4 d-id스튜디오 API로 이미지를

pagichacha.tistory.com

 

 

line 22 : yt객체의 스트림 중 첫번째 스트림을 720p화질+비디오/mp4 형식으로 video_stream 변수에 지정합니다.

line25 : yt객체의 스트림 중 첫번째 스트림을 오디오만+오디오/mp4 형식으로 audio_stream 변수에 지정합니다.

 

line 27 : 비디오 파일의 이름을 video.mp4로 지정하고,

line 28 : 오비디오 파일의 이름은 audio.mp4로 지정합니다.

 

 

line 31 : video_stream을 이용하여 비디오 파일을 다운로드 합니다.

line 33 : audio_stream을 이용하여 오디오 파일을 다운로드 합니다.

 

line 35 : 최종 파일(오디오+비디오 파일)의 이름을 'output_720p.mp4'로 해서 output_file 변수에 할당해 줍니다.

 

 

 

line 39 : subprocess모듈의 run메소드를 이용하여 OS명령어(ffmpeg)를 실행하고 앞에서 만든 오디오파일과 비디오 파일을 합쳐 줍니다.

 

 

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 유튜브 영상 1개를 다운로드 받는 방법에 대하여 가장 간단히 다운로드 받는 방법부터 좋은 화질로 다운로드 받는 방법까지 알아 보았습니다.
 
 
 - 오늘 우리가 배운 내용을 요약 정리해 보면 아래와 같습니다.
 
1. py : 가장 간단하게 유튜브 영상을 다운로드 합니다. 그런데 화질이 구립니다.
2.py : 화질을 720p 정도로 좋게 하여 다운로드 합니다. 그런데 소리가 나오지 않습니다.
3.py : ffmpeg를 사용하여 음성과 영상을 분리하여 다운로드 후 이를 합쳐 줌으로써 위의 문제를 해결합니다.
 
 

 

오늘은 여기까지이며, 위의 내용이 유익하셨다면, 광고 한번씩만 클릭 부탁드립니다.

 

 

감사합니다.

 

728x90
반응형
LIST