如何从视频文件中仅获取第一个隐藏式字幕?

时间:2013-11-20 21:29:05

标签: python python-2.7 video closed-captions

我需要在硬盘上找到某些视频文件的开始日期。修改日期或文件名等对我没有帮助 - 真正的开始时间是隐藏式字幕。

使用CCExtractor和一些Python Popen ...

import subprocess
process = subprocess.Popen(['ccextractorwin.exe', 'mycaptions.srt', '-quiet',
        'myvideo.mpg'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = process.communicate()

这会生成一个隐藏的字幕.srt文件,我想要的肯定是:

1
00:00:00,000 --> 00:00:06,772
4756.9585N, 12905.8976W, 1885   
2013-06-20 16:50:29, Hdg: 54                

2
00:00:06,774 --> 00:00:07,373
2013-06-20 16:50:29, Hdg: 54               
4756.9585N, 12905.8976W, 1883   

...

但问题是这些视频文件是数百GB,而CCExtractor会生成整个字幕文件。我只需要开始时间,这是第一个条目。

CCExtractor上是否有一个模糊的未记录选项,或者是否有另一个(免费)工具可以让我获得第一个条目?

我能想到的唯一选择是启动CCExtractor,生成一个线程来读取正在生成的标题文件,然后终止CCExtractor进程和读取线程。还不错,但我想先看看是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

而不是使用process.communicate(),它阻塞直到从应用程序读取所有数据,而不是逐行读取结果作为流。然后,您可以在阅读后尽可能多地删除基础流程。您还需要使用标记ccextractorwin.exe将输出从-stdout重定向到STDOUT。

import subprocess
process = subprocess.Popen(
    ['ccextractorwin.exe', '-stdout', '-quiet', 'myvideo.mpg'],
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)
all_output = []
while True:
    out_line = process.stdout.readline()
    all_output.append(out_line)  # Add this line to the list of lines to keep
    if out_line == u'\n':  # We've hit an empty line, or whatever else you deem like a good stopping point
        break  # the while loop

# Now, kill the process dead in its tracks.
# This probably isn't great for open file handles, but whatever
process.kill()

这会向应用程序发送SIGKILL,这可能(当然)在Windows上的工作方式与在Linux或OSX上的工作方式不同。如果出现问题,请参阅此处了解有关杀死它的其他解决方案:In Python 2.5, how do I kill a subprocess?

希望有所帮助。