Потеря кадров при отсечении видео с помощью ffmpeg - PullRequest
0 голосов
/ 30 октября 2018

Кажется, я теряю кадры, когда обрезаю видео с помощью ffmpeg.

Вот шаги, которые я предпринимаю:

[Получить номер кадра для вырезания] -> [превратить номер кадра в формат чч: мм: ss.ms] -> [Запустить процесс ffmpeg]

Вот код:

import subprocess

def frames_to_timecode(frame,frameRate):
    '''
    Convert frame into a timecode HH:MM:SS.MS
    frame = The frame to convert into a time code
    frameRate = the frame rate of the video
    '''
    #convert frames into seconds
    seconds = frame / frameRate

    #generate the time code
    timeCode = '{h:02d}:{m:02d}:{s:02f}'.format(
    h=int(seconds/3600),
    m=int(seconds/60%60),
    s=seconds%60)

    return timeCode

frameRate = 24.0

inputVideo = r"C:\Users\aquamen\Videos\vlc-record-2018-10-23-17h11m11s-SEQ-0200_animatic_v4_20180827_short.mp4"
outputVideo = r"C:\Users\aquamen\Videos\ffmpeg_test_clip001.mp4"
ffmpeg = r"C:\ffmpeg\ffmpeg-20181028-e95987f-win64-static\bin\ffmpeg.exe" 

endFrame = frames_to_timecode(29,frameRate)
startFrame = frames_to_timecode(10,frameRate)

subprocess.call([ffmpeg,'-i',inputVideo,'-ss',startFrame,'-to',endFrame,outputVideo])

Вот изображение исходного видео и отсеченного видео с временными кодами, показывающими, что кадр был потерян в процессе. Код времени должен показывать 00: 01: 18: 10 вместо 00: 01: 18: 11.

Original Video that clip was taken from

Clipped Video that's missing the frame

1 Ответ

0 голосов
/ 31 октября 2018

Итак, мой друг понял это. Таким образом, если вы поделите кадр на fps (Frame / fps), вы получите точку, когда этот кадр нужно вырезать с помощью -ss, но проблема в том, что по умолчанию python округляет 12-значный знак после запятой. Поэтому вам НЕ нужно округлять число и указывать в ffmpeg только 3 десятичных знака.

Итак, вот мой исправленный код для любого, кто сталкивается с этой проблемой. Если вы хотите вырезать видео на номер кадра, используйте это:

import subprocess


def frame_to_seconds(frame,frameRate):
    '''
    This will turn the frame into seconds.miliseconds
    so you can cut on frames in ffmpeg
    frame = The frame to convert into seconds
    frameRate = the frame rate of the video
    '''
    frameRate = float(frameRate)
    seconds = frame / frameRate
    result = str(seconds - seconds % 0.001)

    return result

inputVideo = "yourVideo.mp4"

outputVideo = "clipedVideo.mp4"
ffmpeg = r"C:\ffmpeg\bin\ffmpeg.exe" 

frameRate = 24

subprocess.call([ffmpeg,
                 '-i',inputVideo,
                 '-ss',frame_to_seconds(10,frameRate),
                 '-to',frame_to_seconds(20,frameRate),
                 outputVideo])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...