import os
import numpy as np
import librosa
from scipy.signal import correlate
from pydub import AudioSegment
import cv2
import subprocess
def find_start_time(audio_path, target_audio_path):
main_audio, sr_main = librosa.load(audio_path, sr=None)
target_audio, sr_target = librosa.load(target_audio_path, sr=None)
main_audio /= np.max(np.abs(main_audio))
target_audio /= np.max(np.abs(target_audio))
correlation = correlate(main_audio, target_audio, mode='valid')
max_correlation_value = np.max(correlation)
max_correlation_index = np.argmax(correlation)
start_time_seconds = max_correlation_index / sr_main
return start_time_seconds
def cut_and_merge_video(audio_path, video_path, start_time, output_path):
audio = AudioSegment.from_file(audio_path)
start_time_ms = int(start_time * 1000)
trimmed_audio = audio[start_time_ms:]
trimmed_audio.export(output_path, format="mp3")
def get_audio_frame_rate(audio_path):
audio, sr = librosa.load(audio_path, sr=None)
return sr
def convert_to_mp3(input_path, output_path):
audio = AudioSegment.from_file(input_path)
audio.export(output_path, format="mp3")
def merge_video_audio(video_path, audio_path, output_path):
video = cv2.VideoCapture(video_path)
video_fps = int(video.get(cv2.CAP_PROP_FPS))
audio_fps = get_audio_frame_rate(audio_path)
audio = AudioSegment.from_file(audio_path, frame_rate=audio_fps)
audio = audio.set_frame_rate(video_fps)
audio = audio[:int(video.get(cv2.CAP_PROP_FRAME_COUNT))]
final_audio = audio._data
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
output_video = cv2.VideoWriter(output_path, fourcc, video_fps, (int(video.get(3)), int(video.get(4))))
while True:
ret, frame = video.read()
if not ret:
break
output_video.write(frame)
output_video.release()
video.release()
# Örnek kullanım
clip_path = "klip.mp4"
sample_path = "ses.wav"
klaket_path = "klaket.wav"
output_path = "final.mp4"
# "klaket.wav" ve "ses.wav" dosyalarını ".MP3" formatına dönüştür
convert_to_mp3(klaket_path, "klaket.mp3")
convert_to_mp3(sample_path, "ses.mp3")
# Başlangıç saniyelerini bulun
clip_start_time = find_start_time(clip_path, "klaket.mp3")
sample_start_time = find_start_time(sample_path, "ses.mp3")
# Klip ve örnek dosyalarını kesin ve birleştirin
cut_and_merge_video(clip_path, clip_path, clip_start_time, "trimmed_clip.mp3")
cut_and_merge_video(sample_path, sample_path, sample_start_time, "trimmed_sample.mp3")
# Ses ve video dosyalarını birleştirin ve video ve ses akımlarını etiketleyin
merge_video_audio(clip_path, "trimmed_clip.mp3", "output_clip.mp4")
merge_video_audio(sample_path, "trimmed_sample.mp3", "output_sample.mp4")
# Ses ve video dosyalarını birleştirin
os.system(f'ffmpeg -i output_clip.mp4 -i output_sample.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" -map "[v]" -map "[a]" {output_path}')
# Geçici dosyaları temizle
os.remove("klaket.mp3")
os.remove("ses.mp3")
os.remove("trimmed_clip.mp3")
os.remove("trimmed_sample.mp3")
os.remove("output_clip.mp4")
os.remove("output_sample.mp4")