ㅁ 개요
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 소스 실행 방법
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
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 우리가 배운 내용
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 광고 한번씩만 클릭 부탁드립니다.
감사합니다.
'파이썬 프로젝트 강좌(초급) > 유튜브 동영상 다운로드' 카테고리의 다른 글
유튜브 동영상 다운로드 - 4.고화질(1080p)로 다운로드 하기 (4) | 2024.07.06 |
---|---|
유튜브 동영상 다운로드 - 3.유튜브 재생목록(playlist)의 영상 한꺼번에 다운로드 하기 (0) | 2024.07.06 |
유튜브 동영상 다운로드 - 2.유튜브 영상 여러개 다운로드 및 특정 폴더에 넣기 (0) | 2024.07.06 |
유튜브 동영상 다운로드 - 0.소개 (0) | 2024.07.06 |