File size: 3,630 Bytes
837fdb6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from ast import Try
import subprocess as sp
import os

# show current venv: echo $VIRTUAL_ENV
# import sys
# del sys.modules['frames']

# transcript module
# 1. extract timestamps from transcript
# 2. extract captions from transcript
# this module
# 3. extract frames at timestamps 
# 4. add caption to each frame 
# 5. convert images to mp4 video 

# converts a list of images to a mp4 video
def convertImageToVideo():
    cmd = "ffmpeg -y -f image2 -i frame_%04d.jpg output_video.mp4"
    cmd_call = cmd.split()
    working_dir = './workdir'

    with sp.Popen(cmd_call,cwd=working_dir, stderr=sp.PIPE) as proc:
        result = proc.stderr.read()

    return [proc.wait(),result]


# extract a frame as jpg image file 
# from a video at a given timestamp
# num=0; for p in $(cat timestamps); do ((num++)); printf "$num $p\r"; dnum=$(printf "%03d" "$num"); ffmpeg -ss $p -i "$mp4file" -frames:v 1 out_$dnum.jpg >& ffmpeg.out; done
def extractImagesFromVideo(timestamps):
    working_dir = './workdir'
    input_file = 'input_video.mp4'
    if not os.path.isfile(working_dir+'/'+input_file):
        return 'Error: File '+input_file+' is missing, create the file first.'


    # create a working directory for the files
    if not os.path.isdir(working_dir):
        print('There is no working directory. Create a new one.')
        os.mkdir(working_dir)

    proc_list = []
    for current_frame, current_timestamp in enumerate(timestamps, start=1):
        print(f"{current_frame:04d}", current_timestamp)
        cmd = 'ffmpeg -y -ss '+str(current_timestamp)+' -i '+input_file+' -frames:v 1 frame_'+f"{current_frame:04d}"+'.jpg'
        cmd_call = cmd.split()

        with sp.Popen(cmd_call,cwd=working_dir, stderr=sp.PIPE) as proc:
            proc_list.append(proc.wait())

    return proc_list

# add caption to each image
# 'convert' porgram is from the 'imagemagick' package
# num=0; while read p; do ((num++)); dnum=$(printf "%03d" "$num"); printf "$dnum $p\r"; convert out_$dnum.jpg -undercolor Black -fill white -gravity South -pointsize 25 -annotate +0+10     "$p" out_$dnum.jpg >& ffmpeg.out; done<srt.txt
def addCaptionToImage(caption):
    proc_list = []
    for current_frame, current_caption in enumerate(caption.split('\n'), start=1):
        print(f"{current_frame:04d}", current_caption)
        #current_frame=182
        #current_caption='with this method as compared to just'
        
        cmd = 'convert frame_'+f"{current_frame:04d}"+'.jpg -undercolor Black -fill white -gravity South -pointsize 25 -annotate +0+10'
        cmd_call = cmd.split()
        # the 'split' command would also split the input caption
        # therefore it has to be added to the array after the split
        cmd_call.append(current_caption)
        cmd_call.append('frame_'+f"{current_frame:04d}"+'.jpg')
        #cmd_call
        working_dir = './workdir'

        with sp.Popen(cmd_call,cwd=working_dir, stderr=sp.PIPE) as proc:
            proc_list.append(proc.wait())

    return proc_list


def removeFilesInWorkdir():
    result =''
    working_dir = './workdir'
    try:
        for f in os.listdir(working_dir):
            os.remove(os.path.join(working_dir, f))
    except:
        result = 'Error: Not all files could be removed.'
    
    return result

def renameOutputVideo(filenme):
    result = ''
    working_dir = './workdir'
    shelf_dir = './shelf'
    input_filename = working_dir+'/'+'output_video.mp4'
    output_filename = shelf_dir+'/'+filenme+'.mp4'
    try:
        os.rename(input_filename,output_filename)
    except:
        result = 'Error: Could not rename file.'
    
    return result