как синхронизировать c видео и аудио с python opencv и ffmpeg? - PullRequest
0 голосов
/ 28 апреля 2020

Прежде всего, большое спасибо заранее, я не являюсь экспертом в области редактирования видео и музыки c.

Я хочу сделать видео, которое показывает полосу прогресса над спектрограммой определенного трека. Сначала я генерирую спектрограмму трека. Spectrogram of an animal call

После этого я генерирую видео через ffmpeg, чтобы получить правильный размер

ffmpeg -loop 1 -y -i 'image.jpg' -i 'track.wav' -shortest -acodec copy -vcodec mjpeg 'image_plus_track_spectrogram_video.avi'

В следующей процедуре я написал небольшой opencv- python Скрипт для включения полосы прогресса в видео на основе номера видеокадра. Поэтому я использовал opencv для редактирования каждого кадра и объединил их в новое видео. После этого я слил «новое» видео с предыдущим аудиофайлом через ffmpeg для генерации конечного продукта.

import numpy as np
import math
import cv2
import glob
import subprocess



video_file = r"image_plus_track_spectrogram_video.avi")


video_to_manipulate = video_file
cap = cv2.VideoCapture(video_to_manipulate)
alpha = 0.4
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(length)

count = 0


fourcc = cv2.VideoWriter_fourcc(*'mp4v') 
out = cv2.VideoWriter(video_file[:-4]+"_V2.mp4", fourcc, 25, (1875,938)) 
#start and end pixel position
pos1 = 230
pos2 = 1593
fps = 25
pos = pos2 - pos1


frame_pos_gain = pos / length;

curr_pos = pos1

spectrogram_height_max_position = 835
spectrogram_height_min_position = 70

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:

    height, width, channels = frame.shape

    overlay = frame.copy()
    output = frame.copy()

    curr_pos = curr_pos + frame_pos_gain
    pos = int(curr_pos)

    print(pos)

## generate and overlay a red dotted line over the frame based on framenumber, in this case a thick red line

    cv2.rectangle(overlay,(pos, spectrogram_height_max_position),(pos,spectrogram_height_min_position),(0, 0, 255),5)           
    cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)



    cv2.imshow("Output", output)
    out.write(output)


    if cv2.waitKey(fps) & 0xFF == ord('q'):
          break
    else:
          break;
cap.release()
out.release()
cv2.destroyAllWindows()


#merge the new video with the old audio file
subprocess.call(["ffmpeg", "-y", "-i", video_file[:-4]+"_V2.mp4", "-i", video_file[:-4]+".wav", "-c:a", "aac", "-vf", "scale=600:-1", "-strict", "experimental", video_file[:-4]+"_V2_with_sound_rescaled.mp4"],shell=True)

Конечный результат видеокадра не совпадает c с воспроизводимым звуком. Любые предложения, как оптимизировать мой процесс?

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...