Skip to content

Commit 53dd9b1

Browse files
committedMar 27, 2019
fixbug:when subtitle has comma
1 parent 6f91ff6 commit 53dd9b1

File tree

1 file changed

+44
-17
lines changed

1 file changed

+44
-17
lines changed
 

‎convert_video.py

+44-17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#===============================================================================
44
# 视频处理
5+
# 视频转换成mp4格式,并将字幕烧制到视频中
56
#===============================================================================
67
#
78

@@ -10,16 +11,16 @@
1011
import time
1112

1213
#单集动画(1~10分钟)
13-
src_dir = 'D:\\tmp\\video\\source\\'
14-
des_dir = 'D:\\tmp\\video\\target\\'
15-
log_file = r'D:/tmp/video/convert.csv'
16-
commad_line = 'ffmpeg.exe -ss 00:00:02 -i "{0}" -vf subtitles="{1}" "{2}"'
17-
commad_line2 = 'ffmpeg.exe -ss 00:00:02 -i "{0}" "{1}"'
14+
src_dir = 'D:\\tmp\\video-source\\'
15+
des_dir = 'D:\\tmp\\video-target\\'
16+
subtitle_dir = 'D:\\tmp\\video-subtitle\\'
17+
log_file = r'D:/log.csv'
18+
commad_line = 'ffmpeg.exe -i "{0}" -vf subtitles=\"{1}\" "{2}"'
19+
commad_line2 = 'ffmpeg.exe -i "{0}" "{1}"'
20+
1821
#commad_line= commad_line.decode("utf-8").encode("gbk")
1922

2023
def convert_video(filename):
21-
# for filename in os.listdir(src_dir):
22-
2324
froot, fext = os.path.splitext(filename)
2425
fext = fext.lower()
2526

@@ -34,40 +35,64 @@ def convert_video(filename):
3435
# 跳过已存在文件
3536
des_file = des_dir + (froot + ".mp4")
3637
if os.path.exists(des_file):
37-
print("跳过已存在, " + des_file)
38+
to_log("跳过已存在, " + des_file)
3839
return
3940

4041
# 字幕文件
41-
subtitle_file = src_dir + (froot + ".en.srt")
42+
subtitle_file = (froot + ".en.srt")
4243

4344
src_file = src_dir + filename
4445

45-
print(des_file)
46-
print(commad_line.format(src_file, subtitle_file, des_file))
46+
"""
47+
Note:
48+
I think ffmpeg has some problems when it uses the parameter '-vf subtitles ='.
49+
File directory, single quote, comma, etc. are not allowed in this parameter.
50+
"""
51+
os.chdir(subtitle_dir) # ffmpeg提取mkv内的字幕时,有bug!
52+
4753
if '.mp4' == fext:
4854
if os.path.exists(subtitle_file):
49-
os.system(commad_line.format(src_file, subtitle_file, des_file))
55+
run_cmd(src_file, subtitle_file, des_file)
5056
to_log("[mp4有字幕], " + filename)
5157
else:
5258
shutil.copy(src_file, des_file)
5359
to_log("[mp4无字幕], " + filename)
5460
elif '.mkv' == fext:
55-
os.chdir(src_dir) # ffmpeg提取mkv内的字幕时,有bug!
56-
subtitle_file = froot + ".en.srt"
5761
if not os.path.exists(subtitle_file):
62+
# todo
5863
subtitle_file = filename
64+
run_cmd(src_file, subtitle_file, des_file)
5965
to_log("[mkv视频], " + filename)
60-
os.system(commad_line.format(src_file, subtitle_file, des_file))
6166
elif '.webm' == fext:
6267
if os.path.exists(subtitle_file):
63-
os.system(commad_line.format(src_file, subtitle_file, des_file))
68+
run_cmd(src_file, subtitle_file, des_file)
6469
to_log("[webm有字幕], " + filename)
6570
else:
6671
os.system(commad_line2.format(src_file, des_file))
6772
to_log("[webm无字幕], " + filename)
6873
else:
6974
to_log('[未知文件], ' + filename)
7075

76+
#===============================================
77+
# 执行系统指令
78+
# Note: 为了规避ffmpeg缺陷,重命名字幕文件。最后再改回文件名
79+
#===============================================
80+
def run_cmd(srcpath, subtitlefile, despath):
81+
new_name = time.time()
82+
os.rename(subtitlefile, new_name)
83+
os.system(commad_line.format(srcpath, new_name, despath))
84+
os.rename(new_name, subtitlefile)
85+
86+
#===============================================
87+
# mkv视频是否含有字幕
88+
#===============================================
89+
def mkv_has_subtitle(mkv_file):
90+
cmd = "ffmpeg -i \"{0}\" -c copy -map 0:s -f null - -v 0 -hide_banner && echo $? || echo $?"
91+
code = os.system(cmd.format(mkv_file))
92+
# TODO 为调通
93+
if code == 0:
94+
return True
95+
return False
7196

7297
def to_log(line):
7398
fname = log_file
@@ -76,7 +101,9 @@ def to_log(line):
76101
fout.write(line)
77102
fout.write('\n')
78103

79-
104+
#===============================================
105+
# 并发任务
106+
#===============================================
80107
from multiprocessing import Process, Queue, Pool
81108
def batch_tast(processes=10):
82109
""" 并发 """

0 commit comments

Comments
 (0)
Please sign in to comment.