강좌가 아니라 소스를 제공하는 글입니다!
m3u8 링크를 입력해서 ffmpeg명령어를 반환하자!
잠깐!
m3u8파일을 ffmpeg로 받는걸 모르시는 분들은 아래 링크를 참고해주세요!!
m3u8 다운로드 방법에 대해 상세히 설명한 포스팅 글입니다.
https://m.blog.naver.com/nevergu1004/221786580635
(저작자: nevergu1004님)
(프로그램 사용 예시)
‘ffmpeg’ 프로그램을 이용하면 m3u8파일을 다운로드할 수 있습니다.
그러나 일일이 ffmpeg 명령어를 변경하기에는 꽤나 번거롭습니다.
이 때, 사용자는 (보조 프로그램)을 사용해서 m3u8링크만 입력 시, 해당 링크가 첨가된 ffmpeg 명령어를 받을 수 있습니다.
(프로그램 진행 화면)
1. bin폴더에 save디렉토리를 만들어주세요!
그리고 M3u8 Command가 보조 프로그램입니다!
2. M3u8 Command에 m3u8링크를 입력하고 엔터를 친 결과입니다. mp4파일 이름은 랜덤된 영어 5글자이므로 겹치지 않습니다!
참고) Chrome Play Hls 가 첨가된 링크를 입력해도 인식됩니다.
ex) chrome-extension://ckblfogh/player.html#http://helloworld.m3u8
3. pre-copy 버튼을 누르면 ffmpeg가 있는 디렉토리로 이동하는 명령어가 복사됩니다. -> CMD에 붙여 넣기!
4. Copy & Delete버튼을 누르면, Return영역의 ffmpeg (실행) 명령어가 복사됩니다. Entry란과 Return란은 재사용할 수 있게 지워집니다! -> 다시 CMD에 붙여 넣기!
5. bin의 save 폴더 내에 mp4파일이 저장된 모습입니다.
(Update) cmd버튼 생성 : 누르면 ‘명령 프롬프트’ 실행 /2020.06.28
=> py.exe가 명령 프롬프트 형태를 지닙니다.
소스 제공)
사용자 입장에 맞춰서 아래 line 8은 변경해서 사용해주세요!!
win.clipboard_append("cd C:"+chr(92)+"ffmpeg conversion"+chr(92)+"ffmpeg-20200620-29ea4e1-win64-static"+chr(92)+"bin") # chr(92) == '\' (ASCII Code)
(ffmpeg 폴더가 C드라이브 바로 아래에 있고 이름이 ffmpeg conversion이면 문제가 생기지 않습니다.)
from threading import Thread import tkinter as tk import random import os def cmd_start(): x=win.winfo_screenwidth()/2+300 y=win.winfo_screenheight()/2-150 win.wm_geometry("+%d+%d"%(x,y)) thread=Thread(target=real_start) thread.setDaemon(True) thread.start() # 타겟된 메소드를 다른 코어에서 일 시작 def real_start(): os.system("%windir%\system32\cmd.exe") # 명령어(ffmpeg 파일이 있는 디렉토리로 이동) 복사 def precopy(): win.clipboard_clear() win.clipboard_append("cd C:"+chr(92)+"ffmpeg conversion"+chr(92)+"ffmpeg-20200620-29ea4e1-win64-static"+chr(92)+"bin") entry.delete(0,tk.END) entry.insert(0,'precopy ok') # 명령어 코드 반환 def html(event): # 파일 이름 랜덤 제작 (5철자) random_values=[0 for i in range(5)] name='' for i in range(5): random_values[i]=random.randint(97,122) if i==0: name=chr(random_values[i]) else: name=name+chr(random_values[i]) # 코드 제작 및 반환 파트 global s s1='ffmpeg.exe -i "' s2=id.get() try: # 크롬 플러그인 복사 링크일 때 # 영상 파일 링크 중 '#'를 기준으로 문자열을 나누고 두 번째 요소를 가져옴 s2=s2.split('#')[1] except: # 크롬 플러그인 복사한 링크가 아닐 때 pass s3='" -bsf:a aac_adtstoasc -c copy ./save/'+str(name)+'.mp4' s=s1+s2+s3 # 글로벌 변수 s text.insert('1.0',s) # 엔트리 내용 제거, 텍스트 내용 복사 및 제거 def delcopy(): global s print("Paste command into CMD :\n"+s+"\n(It has been already copied!)\n") win.clipboard_clear() win.clipboard_append(s) win.update() # now it stays on the clipboard after the window is closed text.delete('1.0','end') entry.delete(0,tk.END) entry.focus() #윈도우 생성 win=tk.Tk() win.title("M3u8 Command") win.geometry("330x190") # 변수 파트 id=tk.StringVar() #입력 엔트리에 바인딩할 변수 global s,cmd_check # 글로벌 변수(입력값 합친거,cmd창 열렸나 체크) s=str('0') # 윈도우 가운데 x=win.winfo_screenwidth()/2-150 y=win.winfo_screenheight()/2-150 win.wm_geometry("+%d+%d"%(x,y)) # 라벨 tk.Label(win,text="Entry:",foreground='red',background="#EAEAEA").grid(row=0,column=0,pady=2,padx=2) tk.Label(win,text="Return:",foreground='red',background="#EAEAEA").grid(row=1,column=0,pady=2,padx=2) # 엔트리 (입력) entry=tk.Entry(win,width=40,textvariable=id) entry.grid(row=0,column=1,pady=2,columnspan=3) entry.bind('<Return>',html) # 텍스트 (결과) text=tk.Text(win,width=40,height=10) text.grid(row=1,column=1,pady=2,columnspan=3) # 버튼 cmd=tk.Button(win,command=cmd_start,text="cmd") cmd.grid(row=2,column=1,pady=1) pre=tk.Button(win,command=precopy,text="pre-copy") pre.grid(row=2,column=2,pady=1) delete=tk.Button(win,command=delcopy,text="Copy & Delete") delete.grid(row=2,column=3,pady=1) # 포커스 및 메인루프 entry.focus() win.mainloop()
간단한 로직 설명)
< 랜덤 파일 이름 생성 >
random모듈의 randint함수를 사용해서 97에서 122사이의 랜덤 값 5개를 생성 -> 97에서 122는 아스키코드(a~z)이므로 chr()함수를 이용하면 다시 문자로 변경이 가능 -> 파이썬은 ‘+’연산자로 문자열이 합쳐지므로 name문자열 뒤에 chr(97)따위를 n회 합쳐서 제작함
< ffmpeg명령어 반환 >
s1에 m3u8링크가 위치하지 전 소스를 저장함 -> s2에 m3u8링크를 저장함 -> s3에 m3u8링크가 위치한 다음의 소스를 저장함 -> 글로벌 변수 s에 ‘+’연산자를 사용해서 문자열 s1+s2+s3를 저장함.
<정적인 소스는 그대로 두고 동적인 소스만 변경하는 방식!>