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

유튜브 동영상 다운로드 - 2.유튜브 영상 여러개 다운로드 및 특정 폴더에 넣기

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

ㅁ 개요

 

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 소스 실행 방법

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

 

 


 
 

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 우리가 배운 내용

 
 - 오늘은 파이썬으로 여러개의 영상을 다운로드하고, 다운로드한 영상은 원하는 폴더에 넣는 방법에 대하여 알아보았습니다.
 
 

 

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

 

 

감사합니다.

728x90
반응형
LIST