HapticsProject / Moviepy
HussainLatiff's picture
Update Moviepy (#16)
a1df37b verified
raw
history blame
6.83 kB
from moviepy.editor import *
import json
current_video_path = r"C:\Users\ASUS\Desktop\UoW\2ND YEAR\SDGP\Test Video\test_video.mp4"
current_video = VideoFileClip(current_video_path) # location of the uploaded video
output_query_response = '{"value":[{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:00:16","end":"00:00:26","best":"00:00:21","relevance":0.4005849361419678},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:00:06","end":"00:00:16","best":"00:00:09","relevance":0.38852864503860474},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:01:42","end":"00:01:58","best":"00:01:43","relevance":0.38718080520629883},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:01:58","end":"00:02:14","best":"00:02:03","relevance":0.3811851143836975},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:00:42","end":"00:00:52","best":"00:00:42","relevance":0.3765566647052765},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:00:26","end":"00:00:42","best":"00:00:28","relevance":0.3718773126602173},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:01:08","end":"00:01:24","best":"00:01:10","relevance":0.3707084357738495},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:01:37","end":"00:01:42","best":"00:01:38","relevance":0.36235538125038147},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:01:29","end":"00:01:37","best":"00:01:33","relevance":0.3606133460998535},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:01:03","end":"00:01:08","best":"00:01:04","relevance":0.3513660728931427},{"documentId":"sp=r&st=2024-02-09T12:33:24Z&se=2025-08-06T20:33:24Z&spr=https&sv=2022-11-02&sr=b&sig=V%2Fq56JjGcL60r0vt3oAPjzx%2FZMu5%2BJo%2BfjKkJF2ccgo%3D","documentKind":"VideoInterval","start":"00:00:00","end":"00:00:06","best":"00:00:05","relevance":0.3378048241138458}]}' # JSON response
# Convert JSON string to Python dictionary
data = json.loads(output_query_response)
# creating an empty array for the results
result = []
# iterate over every explosion occurrence and find start, end, best values using the ml algorithm
for i in data["value"]:
result.append([i["start"], i["end"], i["best"]])
# update start_explosion_time and end_explosion_time for each explosion occurrence
for explosion in result:
best_time = explosion[2]
best_time_seconds = sum(x * int(t) for x, t in zip([3600, 60, 1], best_time.split(":")))
start_explosion_time_seconds = best_time_seconds - 1
end_explosion_time_seconds = best_time_seconds + 2
explosion[0] = "{:02d}:{:02d}:{:02d}".format(start_explosion_time_seconds // 3600,
(start_explosion_time_seconds % 3600 // 60),
start_explosion_time_seconds % 60)
explosion[1] = "{:02d}:{:02d}:{:02d}".format(end_explosion_time_seconds // 3600,
(end_explosion_time_seconds % 3600 // 60),
end_explosion_time_seconds % 60)
# Extracting audio from the video
current_audio_path = "current_audio.mp3"
if current_video.audio is not None:
current_video.audio.write_audiofile(current_audio_path) # location of the audio clip
print("Audio file has been extracted from the video")
else:
print("No audio found in the video.")
# Loading the whole audio clip from the uploaded video
current_audio = AudioFileClip(current_audio_path)
# define the segments for the audio clips
final_audio_segments = []
haptic_audio_path = 'https://phonebrrdemonstration2.blob.core.windows.net/audio3secondsmp3/3_second_explosion_00001.mp3'
haptic_audio = AudioFileClip(haptic_audio_path)
# Iterate through each explosion occurrence and create audio segments
for explosion in result:
start_explosion_time = sum(x * int(t) for x, t in zip([3600, 60, 1], explosion[0].split(":")))
end_explosion_time = sum(x * int(t) for x, t in zip([3600, 60, 1], explosion[1].split(":")))
beginning_audio_clip = current_audio.subclip(0, start_explosion_time)
end_audio_clip = current_audio.subclip(end_explosion_time)
# Adjust the duration of the haptic audio to match the duration between start and end explosion times
haptic_audio_duration = end_explosion_time - start_explosion_time
haptic_audio_clip = haptic_audio.subclip(0, haptic_audio_duration)
final_audio = concatenate_audioclips([beginning_audio_clip, haptic_audio_clip, end_audio_clip])
final_audio_segments.append(final_audio)
# concatenate final audio segments
final_audio = concatenate_audioclips(final_audio_segments)
# Match the audio duration with the video duration
final_audio = final_audio.set_duration(current_video.duration)
# Save the enhanced audio
final_audio_path = "output.mp3"
final_audio.write_audiofile(final_audio_path)
print("Enhanced audio has been created")
# create a video without audio
extracted_video = current_video.without_audio()
# save the video without audio
extracted_video_path = "output.mp4"
extracted_video.write_videofile(extracted_video_path, fps=60)
print("Video without audio has been created")
# combine the final video without the enhanced audio
final_video = extracted_video.set_audio(final_audio)
# save the final video
final_video_path = "final_video.mp4"
final_video.write_videofile(final_video_path)
print("Final video has been created")