안녕하세요??
몇몇 개발자 커뮤니티에서 유튜브 영상을 리뷰 및 추천하는 사이트를 만들면 좋겠다는 글을 본 적이 있는데요 ^^
그런 사이트에서 활용할 수 있도록 유튜브 영상을 다운받아서 일정 간격으로 캡쳐하여 10장씩 merge하는 스크립트를 작성했어요~!
progress를 표시하는 것에 중점을 두었네요 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | from pytube import YouTube from PIL import Image from tqdm import tqdm import cv2, os, pathlib, glob, shutil ### 유튜브 영상을 다운받습니다. ### def yt_download(): yt.streams. filter (progressive = True , file_extension = 'mp4' ).order_by( 'resolution' ).desc().first().download() os.rename(yt.streams.first().default_filename, 'yt_temp.mp4' ) print ( 'Download is finished.' ) return ### 유튜브 영상을 일정 간격으로 캡쳐합니다. ### def capture_mp4(): folder = '.\\temp_yt_capture\\' cap = cv2.VideoCapture( 'yt_temp.mp4' ) if not os.path.isdir(folder): os.mkdir(folder) interval = 3 # 몇 초 간격으로 캡쳐를 할지 결정합니다. success = True count = 0 fps = int (cap.get(cv2.CAP_PROP_FPS)) frame_count = int (cap.get(cv2.CAP_PROP_FRAME_COUNT)) duration = int (frame_count / fps) + 1 fill_zero = len ( str (duration)) progress = [ '-' , '/' , '|' , '\\' ] print ( 'Capture : ' , end = '') while success: success, image = cap.read() if count % (interval * fps) = = 0 : second = str ( int (count / fps)).zfill(fill_zero) prefix = 'temp_' extension = '.jpg' filename = prefix + second + extension cv2.imwrite(folder + filename, image) print ( '\b' + progress[count % 4 ], end = '') count + = 1 list = [] for path, subdirs, files in os.walk(folder): for name in files: list .append(os.path.join(path, name)) ext_list = [ '.jpg' ] for file in list : if os.path.getsize( file ) = = 0 : if any (ext.lower() in pathlib.Path( file ).suffix.lower() for ext in ext_list): print ( '\nDeleted file(s) : ' , file ) os.remove( file ) cap.release() cv2.destroyAllWindows() return ### 다운받은 영상을 merge합니다. ### def img_merge(list_img, number, total_number): images = map (Image. open , list_img) widths, heights = zip ( * (i.size for i in images)) max_width = max (widths) total_height = sum (heights) + ( len (list_img) - 1 ) * 50 new_im = Image.new( 'RGB' , (max_width, total_height), ( 255 , 255 , 255 )) images = map (Image. open , list_img) y = 0 for im in images: x = int ((max_width - im.size[ 0 ]) / 2 ) new_im.paste(im, (x, y)) y + = im.size[ 1 ] + 50 new_im.save( 'result' + str (number).zfill( len ( str (total_number))) + '.jpg' , quality = 95 ) return ### 사진을 10장씩 묶습니다. ### def divide_by_10(): list_jpg = glob.glob( '.\\temp_yt_capture\\*.jpg' ) list_jpg.sort() cuts = len (list_jpg) / / 10 + 1 if len (list_jpg) / 10 ! = len (list_jpg) / / 10 else len (list_jpg) / / 10 print ( '\nMerge : ' ) for i in tqdm( range ( 0 , cuts)): temp_list = list_jpg[i * 10 : (i + 1 ) * 10 ] img_merge(temp_list, i + 1 , cuts) return ### 임시파일을 삭제합니다. ### def delete_temp(): os.remove( 'yt_temp.mp4' ) shutil.rmtree( '.\\temp_yt_capture\\' ) return if __name__ = = '__main__' : yt_download() capture_mp4() divide_by_10() delete_temp() |
progress는 다음과 같이 표시되어요!
다음과 같은 파일들이 생성되는 것을 확인할 수 있어요 ^^
유튜브를 리뷰하는 사이트를 개설하신 분들께서 잘 활용하시면 좋을 것 같네요 :)
허접한 스크립트를 읽어주셔서 감사드립니다!
그럼 맛저 드세요~ ^-^
당장은 아니어도 나중에 유용하게 사용할 보물창고 같네요 ㅎ