ㅁ 개요
O 프로젝트 소개
- 이번 글은 이전글([파이썬 프로젝트 강좌(초급)/유튜브 동영상 다운로드] - 유튜브 동영상 다운로드 - 3.유튜브 재생목록(playlist)의 영상 한꺼번에 다운로드 하기)에 이은 5번째 마지막 글로 고화질(1080p)로 영상을 다운로드 하는 방법을 알아 보겠습니다.
O 완성된 프로그램 실행 화면
1. 7.py 실행 시 아래와 같이 실행되며, 1080p 고화질로 변환 과정에서 상당한 시간이 소요됩니다.(굳이 1080p까지 필요하지 않은 경우에는 720p로 하시면 훨씬 빠르게 다운로드 하실 수 있습니다.)
실행 후 아래와 같이 3개 파일이 생성되며, 영상 및 음성파일과, 최종 합쳐진 파일(out.mp4)이 생성됩니다.
최종 생성된 파일(out.mp4)을 실행하면 아래와 같이 아주 좋은 화질의 영상을 볼 수 있습니다.
하지만 위의 7.py 코드에는 한가지 문제점이 있습니다.
이는 영상의 제목에 특수문자(공백, 쌍따옴표("), 콤마(,) 슬래쉬(/) 등 등)가 포함된 경우 에러가 발생합니다.
아래 8.py 코드에서 이부분을 수정합니다.
2. 8.py 코드 실행 시 아래와 같이 실행됩니다.
7.py와 거의 동일하며, 영상제목에 특수문자 포함되면 필터링 할 수 있도록 이 부분의 코드가 수정되었습니다.
아래와 같이 영상제목에 공백 및 슬래시(/) 가 포함되었음에도 잘 다운로드 된 것을 볼 수 있습니다.
영상도 물론 잘 실행되고 있네요.
아래 유튜브 영상의 제목을 보면 슬래시(/), 공백 등이 섞여 있습니다.
8.py에서 필터링 한 후 제목을 보면 슬래시(/)가 없어지고, 공백은 언더바('_') 로 바뀐 것을 알 수 있습니다.
3. 9.py 코드를 실행하면 아래와 같이 실행 됩니다.
이전 코드와 다른 점은 영상을 imsi 폴더에 다운로드 하고, 소스를 함수로 깔끔하게 정리한 것이 달라전 점이 되겠습니다.
아래와 같이 imsi 폴더에 3개 파일이 생성되었습니다.
결과파일(output_1080p.mp4)을 실행하면 역시나 잘 실행되는 것을 볼 수 있습니다.
ㅁ 세부 내용
O 완성된 소스
소스파일 : 7.py(고화질로 다운로드, 소스 간략 버전)
from pytube import YouTube
import os
import ffmpeg #pip install ffmpeg-python
youtube = YouTube('https://www.youtube.com/watch?v=j5BA4_3yPC8')
video = youtube.streams.filter(res="1080p").first().download()
os.rename(video,"video_1080.mp4")
audio = youtube.streams.filter(only_audio=True)
audio[0].download()
video_stream = ffmpeg.input('video_1080.mp4')
audio_stream = ffmpeg.input('AFC11 엔젤스파이팅 챔피언십 문기범 VS이도겸 MMA.mp4')
ffmpeg.output(audio_stream, video_stream, 'out.mp4').run()
#######################
# 1080p(고화질)로 다운로드, 소스코드 간략 버전
#######################
소스파일 : 8.py (고화질로 다운로드, 소스 간략 버전, 다운로드 파일이름을 영상제목으로 수정)
from pytube import YouTube
import os
import ffmpeg
import re
def clean_filename(filename):
# Remove invalid characters and replace spaces
clean_name = re.sub(r'[\\/*?:"<>|]', "", filename)
clean_name = clean_name.replace(' ', '_')
return clean_name
youtube = YouTube('https://www.youtube.com/watch?v=HR-3o9sZ6rA')
# youtube = YouTube('https://www.youtube.com/watch?v=52j5dsnEa0g')
# Clean the video title
clean_title = clean_filename(youtube.title)
video_title = clean_title + '.mp4'
print(video_title)
# Download video
video = youtube.streams.filter(res="1080p").first().download(filename="video_1080.mp4")
# Download audio
audio = youtube.streams.filter(only_audio=True).first().download(filename="audio.mp4")
# Merge video and audio
video_stream = ffmpeg.input('video_1080.mp4')
audio_stream = ffmpeg.input('audio.mp4')
ffmpeg.output(audio_stream, video_stream, video_title).run()
# Clean up temporary files
os.remove('video_1080.mp4')
os.remove('audio.mp4')
print(f"Download and merge complete. File saved as {video_title}")
소스파일 : 9.py (고화질로 다운로드, 최종 완성 버전)
from pytube import YouTube
import os
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')
def download_youtube_video(url, output_directory='./imsi'):
youtube = YouTube(url, on_progress_callback=on_progress)
# Ensure the output directory exists
if not os.path.exists(output_directory):
os.makedirs(output_directory)
# Get the 1080p video stream
video_stream = youtube.streams.filter(res="1080p", mime_type="video/mp4").first()
if video_stream is None:
print("No 1080p video stream available.")
return
# Get the audio stream
audio_stream = youtube.streams.filter(only_audio=True, mime_type="audio/mp4").first()
if audio_stream is None:
print("No audio stream available.")
return
# Define file paths
video_file = os.path.join(output_directory, 'video_1080.mp4')
audio_file = os.path.join(output_directory, 'audio.mp4')
output_file = os.path.join(output_directory, 'output_1080p.mp4')
# Download video and audio streams
print("Downloading video...")
video_stream.download(output_path=output_directory, filename='video_1080.mp4')
print("Downloading audio...")
audio_stream.download(output_path=output_directory, filename='audio.mp4')
# Merge video and audio using ffmpeg
print("Merging video and audio...")
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}')
# URL to download
# url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M'
url = 'https://www.youtube.com/watch?v=j5BA4_3yPC8'
download_youtube_video(url)
#######################
# 1080p(고화질)로 다운로드
#######################
O 소스 실행 방법
O 주요 내용
소스파일 : 7.py
고화질 영상을 다운로드 받는 소스입니다.(영상 제목에 특수문자가 없어야 합니다.)
line 12 : youtube객체의 스트림 중 첫번째 스트림을 1080p로 다운로드 후 video 변수 할당합니다.
line 13 : 영상 제목의 이름을 "video_1080.mp4"로 변경합니다.
line 14~15 : youtube객체의 스트림 중 오디오 부분만 가져와서 다운로드 합니다.(이름 변경을 안하면 기본적으로 영상제목으로 다운로드 합니다.)
line 17 : 다운로드한 영상 'video_1080.mp4'을 ffmpeg 포멧에 맞게 변형합니다.
line 18 : 다운로드한 오디오 파일 'AFC11 엔젤스파이팅 챔피언십 문기범 vs이도겸 MMA.mp4'을 ffmpeg 포멧에 맞게 변형합니다.
line 20 : ffmpeg 영상포멧파일과 오디오포멧파일을 ffmpeg.output().run()을 이용하여 'out.mp4' 파일로 합칩니다.
소스파일 : 8.py
고화질 영상을 다운로드 받는 소스입니다.(영상 제목에 특수문자가 있어도 다운로드가 가능합니다.)
line 38 : 특수문자 필터를 위한 reguler expression을 사용하기 위해서는 re 모듈을 임포트 해야 합니다.
line 40 : 특수문자 제거를 위한 함수를 정의합니다.
line 42 : re.sub()메소드로 [] 안에 '\' 이후의 문자를 "" 즉, 없애 버립니다.
(\, /, *, ?, :, ", <, >, | 가 나오면 ""로 바꾸기 때문에 즉 없어 집니다.)
line 43 : 빈칸을 '_' 언더바로 바꿉니다.
변경 전 영상제목 https://www.youtube.com/watch?v=HR-3o9sZ6rA
비상계단 모여있었는데…'짧은 동영상' 찍던 여학생들 '봉변' / SBS 8뉴스
변경 후 영상제목
비상계단_모여있었는데…'짧은_동영상'_찍던_여학생들_'봉변'__SBS_8뉴스
line 50 : 원래 영상제목을 인자로 주고 clean_filename(youtube.title)메소드를 호출하여 특수문자를 제거합니다.
line 66~67 : 이제 불필요해진 영상파일과 오디오파일은 삭제해 줍니다.
소스파일 : 9.py
8.py와 달라진 부분은 imsi 폴더 아래에 영상을 다운로드 하고 있으며, 소스를 함수로 만들어 보기 좋게 하였습니다.
다른 부분은 이미 위에서 설명하였으므로 이전 내용을 참고하시기 바랍니다.
여기까지 모든 소스가 완료되었습니다. 하지만, 여기에도 몇 가지 개선점이 있는데요, 아래 개선할 부분을 직접 한번 해보시기 바랍니다.
1.'output_1080p.mp4' <-- 파일이름을 유튜브 제목으로 바꿔 보세요.
2.아래 불필요한 파일은 삭제해 주세요.
>'video_1080.mp4'
>'audio.mp4'
ㅁ 정리
O 우리가 배운 내용
여기까지의 내용이 유익하셨다면, 광고 한번씩만 클릭 부탁드립니다.
감사합니다.
'파이썬 프로젝트 강좌(초급) > 유튜브 동영상 다운로드' 카테고리의 다른 글
유튜브 동영상 다운로드 - 3.유튜브 재생목록(playlist)의 영상 한꺼번에 다운로드 하기 (0) | 2024.07.06 |
---|---|
유튜브 동영상 다운로드 - 2.유튜브 영상 여러개 다운로드 및 특정 폴더에 넣기 (0) | 2024.07.06 |
유튜브 동영상 다운로드 - 1.유튜브 영상 1개 다운로드 (0) | 2024.07.06 |
유튜브 동영상 다운로드 - 0.소개 (0) | 2024.07.06 |