#!/usr/bin/env python3 # Copyright 2014 (C) Raster Software Vigo (Sergio Costas) # # This file is part of DeVeDe-NG # # DeVeDe-NG is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # DeVeDe-NG is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see import subprocess import os import devede.configuration_data import devede.executor import devede.mux_dvd_menu class avconv_converter(devede.executor.executor): supports_analize = False supports_play = False supports_convert = True supports_menu = True display_name = "AVCONV" disc_types = ["dvd","vcd","svcd","cvd","divx","mkv"] @staticmethod def check_is_installed(): try: handle = subprocess.Popen(["avconv","-version"], stdout = subprocess.PIPE, stderr = subprocess.PIPE) (stdout, stderr) = handle.communicate() if 0==handle.wait(): return True else: return False except: return False def __init__(self): devede.executor.executor.__init__(self) self.config = devede.configuration_data.configuration.get_config() def convert_file(self,file_project,output_file,video_length): self.text = _("Converting %(X)s") % {"X" : file_project.title_name} if (video_length == 0): self.final_length = file_project.original_length else: self.final_length = video_length self.command_var=[] self.command_var.append("avconv") self.command_var.append("-i") self.command_var.append(file_project.file_name) if (file_project.volume!=100): self.command_var.append("-vol") self.command_var.append(str((256*file_project.volume)/100)) if (file_project.audio_delay != 0.0) and (file_project.copy_sound==False) and (file_project.no_reencode_audio_video==False): self.command_var.append("-itsoffset") self.command_var.append(str(file_project.audio_delay)) self.command_var.append("-i") self.command_var.append(file_project.file_name) self.command_var.append("-map") self.command_var.append("1:0") if (not file_project.copy_sound) and (not file_project.no_reencode_audio_video): for l in range (file_project.audio_streams): self.command_var.append("-map") self.command_var.append("0"+":"+str(l+1)) if (file_project.no_reencode_audio_video==False): cmd_line="" if file_project.deinterlace=="deinterlace_yadif": cmd_line+="yadif" vflip=False hflip=False if (file_project.rotation=="rotation_90"): if (cmd_line!=""): cmd_line+=",fifo," cmd_line+="transpose=1" elif (file_project.rotation=="rotation_270"): if (cmd_line!=""): cmd_line+=",fifo," cmd_line+="transpose=2" elif (file_project.rotation=="rotation_180"): vflip=True hflip=True if (file_project.mirror_vertical): vflip=not vflip if (file_project.mirror_horizontal): hflip=not hflip if (vflip): if (cmd_line!=""): cmd_line+=",fifo," cmd_line+="vflip" if (hflip): if (cmd_line!=""): cmd_line+=",fifo," cmd_line+="hflip" if (file_project.width_midle != file_project.original_width) or (file_project.height_midle != file_project.original_height): if (cmd_line!=""): cmd_line+=",fifo," x = (file_project.width_midle - file_project.original_width) /2 y = (file_project.height_midle - file_project.original_height) /2 cmd_line+="pad="+str(file_project.width_midle)+":"+str(file_project.height_midle)+":"+str(x)+":"+str(y)+":0x000000" if (file_project.width_final != file_project.width_midle) or (file_project.height_final != file_project.height_midle): if (cmd_line!=""): cmd_line+=",fifo," cmd_line+="scale="+str(file_project.width_final)+":"+str(file_project.height_final) if cmd_line!="": self.command_var.append("-vf") self.command_var.append(cmd_line) self.command_var.append("-y") vcd=False if (self.config.disc_type!="divx"): self.command_var.append("-target") if (self.config.disc_type=="dvd"): if not file_project.format_pal: self.command_var.append("ntsc-dvd") elif (file_project.original_fps==24): self.command_var.append("film-dvd") else: self.command_var.append("pal-dvd") if (not file_project.copy_sound): self.command_var.append("-acodec") self.command_var.append("ac3") elif (self.config.disc_type=="vcd"): vcd=True if not file_project.format_pal: self.command_var.append("ntsc-vcd") else: self.command_var.append("pal-vcd") elif (self.config.disc_type=="svcd"): if not file_project.format_pal: self.command_var.append("ntsc-svcd") else: self.command_var.append("pal-svcd") elif (self.config.disc_type=="cvd"): if not file_project.format_pal: self.command_var.append("ntsc-svcd") else: self.command_var.append("pal-svcd") else: # DivX self.command_var.append("-vcodec") self.command_var.append("mpeg4") self.command_var.append("-acodec") self.command_var.append("libmp3lame") self.command_var.append("-f") self.command_var.append("avi") if (not file_project.no_reencode_audio_video): self.command_var.append("-sn") # no subtitles if file_project.copy_sound or file_project.no_reencode_audio_video: self.command_var.append("-acodec") self.command_var.append("copy") #else: # if (self.config.disc_type=="divx"): # self.command_var.append("-acodec") # self.command_var.append("mp3") #if (audiostream!=10000): # self.command_var.append("-aid") # self.command_var.append(str(audiostream)) if file_project.no_reencode_audio_video: self.command_var.append("-vcodec") self.command_var.append("copy") if (vcd==False): if not file_project.format_pal: if (file_project.original_fps==24) and ((self.config.disc_type=="dvd") or (self.config.disc_type=="divx")): str_final_framerate="24000/1001" keyintv=15 telecine=True else: str_final_framerate="30000/1001" keyintv=18 else: str_final_framerate="25" keyintv=15 if not file_project.gop12: self.command_var.append("-g") self.command_var.append(str(keyintv)) if (self.config.disc_type=="divx"): self.command_var.append("-g") self.command_var.append("300") elif file_project.gop12 and (file_project.no_reencode_audio_video==False): self.command_var.append("-g") self.command_var.append("12") self.command_var.append("-bf") self.command_var.append("2") self.command_var.append("-strict") self.command_var.append("1") if video_length != 0: self.command_var.append("-t") self.command_var.append(str(video_length)) # else: # if videofile["cutting"]==1: # first half only # self.command_var.append("-t") # self.command_var.append(str(videofile["olength"]/2)) # elif videofile["cutting"]==2: # second half only # self.command_var.append("-ss") # self.command_var.append(str((videofile["olength"]/2)-5)) # start 5 seconds before #if (audiodelay!=0.0) and (copy_audio==False) and (isvob==False): # self.command_var.append("-delay") # self.command_var.append(str(audiodelay)) self.command_var.append("-ac") if (file_project.sound5_1) and ((self.config.disc_type=="dvd") or (self.config.disc_type=="divx")): self.command_var.append("6") else: self.command_var.append("2") #if (isvob==False) and (default_res==False): # self.command_var.append("-ofps") # self.command_var.append(str_final_framerate) self.command_var.append("-aspect") self.command_var.append(str(file_project.aspect_ratio_final)) if self.config.disc_type=="divx": self.command_var.append("-vtag") self.command_var.append("DX50") if (file_project.deinterlace == "deinterlace_ffmpeg") and (file_project.no_reencode_audio_video==False): self.command_var.append("-deinterlace") if (file_project.no_reencode_audio_video==False) and (vcd==False): self.command_var.append("-s") self.command_var.append(str(file_project.width_final)+"x"+str(file_project.height_final)) self.command_var.append("-trellis") self.command_var.append("1") self.command_var.append("-mbd") self.command_var.append("2") if (vcd == False) and (file_project.no_reencode_audio_video == False): self.command_var.append("-b:a") self.command_var.append(str(file_project.audio_rate_final)+"k") self.command_var.append("-b:v") self.command_var.append(str(file_project.video_rate_final)+"k") self.command_var.append(output_file) def create_menu_mpeg(self,n_page,background_music,sound_length,pal,output_path): self.n_page = n_page self.final_length = float(sound_length) self.text = _("Creating menu %(X)d") % {"X": self.n_page} self.command_var=[] self.command_var.append("avconv") self.command_var.append("-loop") self.command_var.append("1") self.command_var.append("-f") self.command_var.append("image2") self.command_var.append("-i") self.command_var.append(os.path.join(output_path,"menu_"+str(n_page)+"_bg.png")) self.command_var.append("-i") self.command_var.append(background_music) self.command_var.append("-y") self.command_var.append("-target") if pal: self.command_var.append("pal-dvd") else: self.command_var.append("ntsc-dvd") self.command_var.append("-acodec") self.command_var.append("mp2") self.command_var.append("-s") if pal: self.command_var.append("720x576") else: self.command_var.append("720x480") self.command_var.append("-g") self.command_var.append("12") self.command_var.append("-b:v") self.command_var.append("2500k") self.command_var.append("-b:a") self.command_var.append("192k") self.command_var.append("-aspect") self.command_var.append("4:3") self.command_var.append("-t") self.command_var.append(str(1+sound_length)) self.command_var.append(os.path.join(output_path,"menu_"+str(n_page)+".mpg")) muxer = devede.mux_dvd_menu.mux_dvd_menu() muxer.create_mpg(n_page,output_path) # the muxer process depends of the converter process muxer.add_dependency(self) self.add_child_process(muxer) def process_stdout(self,data): return def process_stderr(self,data): pos = data[0].find("time=") if (pos != -1): pos+=5 pos2 = data[0].find(" ",pos) if (pos2 != -1): t = float(data[0][pos:pos2]) / self.final_length self.progress_bar[1].set_fraction(t) self.progress_bar[1].set_text("%.1f%%" % (100.0 * t))