ㅁ 개요
O 프로젝트 소개
- 이번 글은 이전글([파이썬 프로젝트 강좌(초급)/유튜브 동영상 다운로드] - 유튜브 동영상 다운로드 - 1.유튜브 영상 1개 다운로드)에 이은 3번째 글로 파이썬으로 여러개의 영상을 다운로드하고, 다운로드한 영상은 원하는 폴더에 넣는 방법에 대하여 알아보겠습니다.
O 완성된 프로그램 실행 화면
1. 4.py 실행 시 아래와 같이 실행되며,
imsi 폴더를 생성(기존에 있으면 생성하지 않음)하고,
그 폴더 안에 아래와 같이 음성파일, 영상파일, 그리고 이 둘을 합친 파일로 생성합니다.
위의 output_720p.mp4 파일을 실행하면 아래와 같이 소리와 화질 모두 잘 나오는 것을 확인할 수 있습니다.
2. 5.py는 여러 영상을 한꺼번에 받은 소스코드로 개선하였습니다.
아래와 같이 실행하면
imsi폴더에 소스코드에 지정한 영상 갯수 만큼 다운로드를 진행합니다.(아래에서는 3개 영상 다운로드)
다운로드 받은 영상 실행시 아래와 같이 잘 실행(화질+소리) 되는 것을 볼 수 있습니다.
ㅁ 세부 내용
O 완성된 소스
소스파일 : 4.py (원하는 폴더에 다운로드 영상 넣기)
from pytube import YouTube
import subprocess
import os
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)
# Ensure the output directory exists
output_directory = './imsi'
if not os.path.exists(output_directory):
os.makedirs(output_directory)
# 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 = os.path.join(output_directory, 'video.mp4')
# print(video_file)
audio_file = os.path.join(output_directory, 'audio.mp4')
print("Downloading video...")
video_stream.download(output_path=output_directory, filename='video.mp4')
print("Downloading audio...")
audio_stream.download(output_path=output_directory, filename='audio.mp4')
output_file = os.path.join(output_directory, '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}')
###################
# 다운로드 영상을 특정 폴더에 넣기
###################
소스파일 : 5.py(영상 여러개 다운로드 하기)
from pytube import YouTube
import subprocess
import os
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')
urls = [
'https://www.youtube.com/watch?v=eGca4kwDvGc',
'https://www.youtube.com/watch?v=qnXHPv1g9Jo',
'https://www.youtube.com/watch?v=xuXCrZYpiqY'
]
# Ensure the output directory exists
output_directory = './imsi'
if not os.path.exists(output_directory):
os.makedirs(output_directory)
for idx, url in enumerate(urls):
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()
if video_stream is None or audio_stream is None:
print(f"Error: Video or audio stream not found for URL {url}")
continue
video_file = os.path.join(output_directory, f'video_{idx}.mp4')
audio_file = os.path.join(output_directory, f'audio_{idx}.mp4')
output_file = os.path.join(output_directory, f'output_720p_{idx}.mp4')
print(f"Downloading video {idx+1}...")
video_stream.download(output_path=output_directory, filename=f'video_{idx}.mp4')
print(f"Downloading audio {idx+1}...")
audio_stream.download(output_path=output_directory, filename=f'audio_{idx}.mp4')
print(f"Merging video and audio for video {idx+1}...")
# 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 for video {idx+1}. File saved as {output_file}')
print("All downloads and merges complete.")
##############################
# 영상 여러개 다운로드 받기
##############################
O 소스 실행 방법
O 주요 내용
소스 파일 : 4.py
이전 소스코드설명 시 다른 내용만 설명합니다.
line 24 : 다운로드 받은 영상을 넣을 폴더를 지정합니다. 여기서는 './imsi' 로 하여 현재 폴더 아래에 imsi 폴더로 지정하였습니다.
line 25~26 : imsi 폴더가 없으면 새로 만들도록 하였으며, 만일 imsi 폴더가 존재하는 경우에는 if문을 실행하지 않으므로 건너 뛰게 됩니다.(즉, 에러발생 X)
line 37, 39, 51 : './imsi' 폴더 아래에 영상/음성/합친파일을 다운로드 해야 하므로 경로를 맞춰 주고 있습니다.
소스 파일 : 5.py
5.py 소스는 여러 영상을 다운로드 받도록 수정한 코드 입니다.
line 20~24 : 여러 영상을 받을 수 있도록 리스트에 영상 url 주소를 담아 둡니다.
line 32 : for문을 이용하여 영상을 하나씩 돌면서 urls 리스트의 모든 영상을 다운로드 합니다.
line 41~43 : 간혹 영상의 스트림을 가져오지 못하는 경우가 있습니다. 이를 대비하여 if문으로 스트림을 가져오지 못하는 경우 해당 스트림은 건너 띄고, 다음 영상을 받도록 처리해 줍니다.
line 45~47 : 여러 영상을 받아야 하기 때문에 이름을 구분해야 하며, 여기서는 아래와 같이 idx(0부터 시작)로 이름을 구분하도록 해 주었습니다.
(output_720_0.mp4, output_720_1.mp4, output_720_2.mp4)
ㅁ 정리
O 우리가 배운 내용
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 광고 한번씩만 클릭 부탁드립니다.
감사합니다.
'파이썬 프로젝트 강좌(초급) > 유튜브 동영상 다운로드' 카테고리의 다른 글
유튜브 동영상 다운로드 - 4.고화질(1080p)로 다운로드 하기 (4) | 2024.07.06 |
---|---|
유튜브 동영상 다운로드 - 3.유튜브 재생목록(playlist)의 영상 한꺼번에 다운로드 하기 (0) | 2024.07.06 |
유튜브 동영상 다운로드 - 1.유튜브 영상 1개 다운로드 (0) | 2024.07.06 |
유튜브 동영상 다운로드 - 0.소개 (0) | 2024.07.06 |