karideo/back/tools/videoTranscode.py
2020-01-11 23:28:18 +00:00

355 lines
13 KiB
Python
Executable File

#!/usr/bin/python
# -*- coding: utf-8 -*-
##
## @author Edouard DUPIN
##
## @copyright 2016, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
import os
import fnmatch
import sys
import subprocess
import shlex
##
## @brief Execute the command with no get of output
##
def run_command(cmd_line):
# prepare command line:
args = shlex.split(cmd_line)
print("[INFO] cmd = " + str(args))
try:
# create the subprocess
p = subprocess.Popen(args)
except subprocess.CalledProcessError as e:
print("[ERROR] subprocess.CalledProcessError : " + str(args))
return False
#except:
# debug.error("Exception on : " + str(args))
# launch the subprocess:
output, err = p.communicate()
# Check error :
if p.returncode == 0:
return True
else:
return False
##
## @brief Get list of all Files in a specific path (with a regex)
## @param[in] path (string) Full path of the machine to search files (start with / or x:)
## @param[in] regex (string) Regular expression to search data
## @param[in] recursive (bool) List file with recursive search
## @param[in] remove_path (string) Data to remove in the path
## @return (list) return files requested
##
def get_list_of_file_in_path(path, regex="*", recursive = False, remove_path=""):
out = []
if os.path.isdir(os.path.realpath(path)):
tmp_path = os.path.realpath(path)
tmp_rule = regex
else:
debug.error("path does not exist : '" + str(path) + "'")
for root, dirnames, filenames in os.walk(tmp_path):
deltaRoot = root[len(tmp_path):]
while len(deltaRoot) > 0 \
and ( deltaRoot[0] == '/' \
or deltaRoot[0] == '\\' ):
deltaRoot = deltaRoot[1:]
if recursive == False \
and deltaRoot != "":
return out
tmpList = filenames
if len(tmp_rule) > 0:
tmpList = fnmatch.filter(filenames, tmp_rule)
# Import the module :
for cycleFile in tmpList:
#for cycleFile in filenames:
add_file = os.path.join(tmp_path, deltaRoot, cycleFile)
if len(remove_path) != 0:
if add_file[:len(remove_path)] != remove_path:
print("ERROR : Request remove start of a path that is not the same: '" + add_file[:len(remove_path)] + "' demand remove of '" + str(remove_path) + "'")
else:
add_file = add_file[len(remove_path)+1:]
out.append(add_file)
return out;
#ffmpeg -i 000.ts -threads 0 -vcodec libx264 -crf 20 -force_key_frames expr:gte\(t,n_forced*1\) -s 720x540 -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace 000_transcoded.ts
#ffmpeg -i 000.ts -threads 0 -vcodec libx264 -crf 20 -force_key_frames expr:gte\(t,n_forced*1\) -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace 000_transcoded.ts
"""
def remove_group(list_of_file=[], total_count_of_file=0):
id_elem = 0
for elem in list_of_file:
id_elem += 1
tmpfile_name = elem.replace(" ", "\ ").replace("!", "\\!").replace("'", "\\'")
print(" [" + str(id_elem) + " / " + str(total_count_of_file) + "] " + tmpfile_name)
cmd_line = "rm " + tmpfile_name
ret = run_command(cmd_line)
list_files_tmp = get_list_of_file_in_path('.', "*__", recursive = True)
remove_group(list_files_tmp, len(list_files_tmp))
list_files_sha512 = get_list_of_file_in_path('.', "*.sha512", recursive = True)
remove_group(list_files_sha512, len(list_files_sha512))
exit(0)
"""
list_files_ts = get_list_of_file_in_path('.', "*.ts", recursive = True)
list_files_flv = get_list_of_file_in_path('.', "*.flv", recursive = True)
list_files_mp4 = get_list_of_file_in_path('.', "*.mp4", recursive = True)
list_files_avi = get_list_of_file_in_path('.', "*.avi", recursive = True)
list_files_mkv = get_list_of_file_in_path('.', "*.mkv", recursive = True)
list_files_wmv = get_list_of_file_in_path('.', "*.wmv", recursive = True)
list_files_divx = get_list_of_file_in_path('.', "*.divx", recursive = True)
list_files_webm = get_list_of_file_in_path('.', "*.webm", recursive = True)
"""
# remove all encoded element in the other files (TS)
for elem_mkv in list_files_mkv:
index = 0
for elem_ts in list_files_ts:
if elem_mkv[:-3]+"ts" == elem_ts:
break;
index += 1
if index != len(list_files_ts):
print("[INFO] remove from list '" + list_files_ts[index] + "' ==> already transcoded")
del list_files_ts[index]
# remove all encoded element in the other files (FLV)
for elem_mkv in list_files_mkv:
index = 0
for elem_flv in list_files_flv:
if elem_mkv[:-3]+"flv" == elem_flv:
break;
index += 1
if index != len(list_files_flv):
print("[INFO] remove from list '" + list_files_flv[index] + "' ==> already transcoded")
del list_files_flv[index]
# remove all encoded element in the other files (mp4)
for elem_mkv in list_files_mkv:
index = 0
for elem_mp4 in list_files_mp4:
if elem_mkv[:-3]+"mp4" == elem_mp4:
break;
index += 1
if index != len(list_files_mp4):
print("[INFO] remove from list '" + list_files_mp4[index] + "' ==> already transcoded")
del list_files_mp4[index]
# remove all encoded element in the other files (TS)
for elem_mkv in list_files_mkv:
index = 0
for elem_avi in list_files_avi:
if elem_mkv[:-3]+"ts" == elem_avi:
break;
index += 1
if index != len(list_files_avi):
print("[INFO] remove from list '" + list_files_avi[index] + "' ==> already transcoded")
del list_files_avi[index]
# remove all encoded element in the other files (wmv)
for elem_mkv in list_files_mkv:
index = 0
for elem_wmv in list_files_wmv:
if elem_mkv[:-3]+"wmv" == elem_wmv:
break;
index += 1
if index != len(list_files_wmv):
print("[INFO] remove from list '" + list_files_wmv[index] + "' ==> already transcoded")
del list_files_wmv[index]
# remove all encoded element in the other files (divx)
for elem_mkv in list_files_mkv:
index = 0
for elem_divx in list_files_divx:
if elem_mkv[:-3]+"divx" == elem_divx:
break;
index += 1
if index != len(list_files_divx):
print("[INFO] remove from list '" + list_files_divx[index] + "' ==> already transcoded")
del list_files_divx[index]
"""
print("list of elements TS : ")
for elem in list_files_ts:
print(" - '" + str(elem) + "'")
print("list of elements MP4 : ")
for elem in list_files_mp4:
print(" - '" + str(elem) + "'")
print("list of elements FLV : ")
for elem in list_files_flv:
print(" - '" + str(elem) + "'")
print("list of elements AVI : ")
for elem in list_files_avi:
print(" - '" + str(elem) + "'")
print("list of elements WMV : ")
for elem in list_files_wmv:
print(" - '" + str(elem) + "'")
print("list of elements MKV : ")
for elem in list_files_mkv:
print(" - '" + str(elem) + "'")
print("list of elements divx : ")
for elem in list_files_divx:
print(" - '" + str(elem) + "'")
print("list of elements webm : ")
for elem in list_files_webm:
print(" - '" + str(elem) + "'")
import random
from pymediainfo import MediaInfo
for arg in sys.argv:
print("arg: " + arg)
id_value = 0
if len(sys.argv) == 2:
id_value = int(sys.argv[1])
tmp_name_encoded_file = "zzz_transcoded_" + str(id_value) + ".mkv"
print("lement name: " + tmp_name_encoded_file)
element_error=[]
def trancode_local(list_of_file=[], extention="ts", total_count_of_file=0, offset=0) :
global element_error;
print("Start strancoding: '." + extention + "' ... " + str(len(list_of_file)))
id_elem = 0
for elem in list_of_file:
id_elem += 1
print(" ========================================================================================")
print(" == " + str(offset+id_elem) + " / " + str(total_count_of_file))
print(" == Trancode: '" + elem.replace("'", "\'") + "'")
print(" ========================================================================================")
if not os.path.isfile(elem):
print(" ==> file does not exist")
continue
cmd_line = "rm " + tmp_name_encoded_file
ret = run_command(cmd_line)
# collect media info ...
#if it is a mk: .. chack the opus format...
if extention == "mkv":
media_info = MediaInfo.parse(elem)
print("media-info: ... " + str(len(media_info.tracks)))
need_trascode_audio = False
for elem_track in media_info.tracks:
data_print = "[" + str(elem_track.track_id) + "] " + str(elem_track.track_type)
#print('track_id = ' + str(elem_track.track_id))
#print('track_type = ' + str(elem_track.track_type))
if elem_track.track_type == "Audio":
data_print += " (" + str(elem_track.language) + ") enc=" + str(elem_track.format);
#print('language = ' + str(elem_track.language))
#print('format = ' + str(elem_track.format))
if elem_track.format != "Opus":
need_trascode_audio = True
elif elem_track.track_type == "Video":
data_print += " enc=" + str(elem_track.format);
print(" - " + data_print)
#print("media-info: ..." + str(dir(elem_track)))
if need_trascode_audio == False:
print(" ==> No transcoding, already in the good format...")
continue
"""
media_info = MediaInfo.parse(elem)
print("media-info: ..." + str(len(media_info.tracks)))
for elem_track in media_info.tracks:
print('track_type = ' + str(elem_track.track_type))
print('track_id = ' + str(elem_track.track_id))
print('language = ' + str(elem_track.language))
#print("media-info: ..." + str(dir(elem_track)))
continue
"""
if extention != "mkv":
cmd_line = "ffmpeg -fflags +genpts -i "
#cmd_line = "ffmpeg -fflags +igndts -i "
else:
cmd_line = "ffmpeg -i "
cmd_line += elem.replace(" ", "\ ").replace("'", "\\'")
#cmd_line += " -threads 4 -vcodec libx264 -crf 22 -force_key_frames expr:gte\(t,n_forced*1\) -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace zzz_transcoded.mkv_tmp"
#cmd_line += " -threads 4 -vcodec copy -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace tmp_transcoded.avi"
#cmd_line += " -threads 4 -vcodec copy -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace tmp_transcoded.mp4"
#cmd_line += " -threads 6 -c:v libvpx-vp9 -lossless 1 -c:a libopus -b:a 128k -deinterlace tmp_transcoded.webm"
#cmd_line += " -threads 6 -c:v libvpx-vp9 -row-mt 1 -c:a libopus -b:a 128k -deinterlace tmp_transcoded.webm"
# -map 0:v ==> copy all video stream
# -map 0:a ==> copy all audio stream
# -map 0:s ==> copy all subtitle stream
cmd_line += " -map 0:v -map 0:a -c:v copy -c:a libopus -ac 2 -b:a 192k -r:a 48000 -deinterlace -threads 6 " + tmp_name_encoded_file
#cmd_line += " -threads 4 -vcodec copy -acodec copy tmp_transcoded.webm"
ret = run_command(cmd_line)
print(" ret value = " + str(ret))
if ret == False:
print("[ERROR] Trancode: error occured ...")
element_error.append(elem)
#exit(-1)
continue
print(" move in: '" + elem[:-len(extention)] + "mkv'")
# cmd_line = "mv " + elem.replace(" ", "\ ").replace("'", "\\'") + " last_transcoded.xx"
cmd_line = "mv " + elem.replace(" ", "\ ").replace("!", "\\!").replace("'", "\\'") + " last_transcoded"
ret = run_command(cmd_line)
cmd_line = "mv " + tmp_name_encoded_file + " " + elem.replace(" ", "\ ").replace("!", "\\!").replace("'", "\\'")[:-len(extention)] + "mkv"
ret = run_command(cmd_line)
#cmd_line = "mv " + elem.replace(" ", "\ ").replace("'", "\\'") + " last_transcoded.ts"
#ret = run_command(cmd_line)
#break
full_list_size = len(list_files_ts) + len(list_files_mp4) + len(list_files_flv) + len(list_files_avi) + len(list_files_wmv) + len(list_files_divx) + len(list_files_mkv) + len(list_files_webm)
offset = 0;
reverse_sort = False
list_files_ts.sort(reverse=reverse_sort)
list_files_mp4.sort(reverse=reverse_sort)
list_files_flv.sort(reverse=reverse_sort)
list_files_avi.sort(reverse=reverse_sort)
list_files_wmv.sort(reverse=reverse_sort)
list_files_divx.sort(reverse=reverse_sort)
list_files_mkv.sort(reverse=reverse_sort)
list_files_webm.sort(reverse=reverse_sort)
random.shuffle(list_files_mp4)
random.shuffle(list_files_avi)
random.shuffle(list_files_mkv)
trancode_local(list_files_ts , "ts", full_list_size, offset)
offset += len(list_files_ts)
trancode_local(list_files_mp4 , "mp4", full_list_size, offset)
offset += len(list_files_mp4)
trancode_local(list_files_flv , "flv", full_list_size, offset)
offset += len(list_files_flv)
trancode_local(list_files_avi , "avi", full_list_size, offset)
offset += len(list_files_avi)
trancode_local(list_files_wmv , "wmv", full_list_size, offset)
offset += len(list_files_wmv)
trancode_local(list_files_divx , "divx", full_list_size, offset)
offset += len(list_files_divx)
trancode_local(list_files_mkv , "mkv", full_list_size, offset)
offset += len(list_files_mkv)
#trancode_local(list_files_webm , "webm", full_list_size, offset)
#offset += len(list_files_webm)
print("List error transcode: " + len(element_error))
for elem in element_error:
print(" == Trancode: '" + elem.replace("'", "\'") + "'")
## extract a thumb from a video
## ffmpeg -i Passenger.mkv -ss 00:05:00 -f image2 -vframes 1 thumb.jpg