Вырезать части видео с помощью gstreamer/Python (gnonlin?)

У меня есть видеофайл, и я хотел бы вырезать некоторые сцены (идентифицированные по временной позиции или по кадру). Насколько я понимаю, это должно быть возможно с gnonlin, но до сих пор я не смог найти пример того, как это сделать (в идеале с использованием Python). Я не хочу изменять видео / аудио части, если это возможно (но конвертация в mp4/webm будет приемлемой).

Правильно ли я понимаю, что gnonlin - это правильный компонент во вселенной gstreamer для этого? Также я был бы рад за несколько указателей / рецептов, как подходить к проблеме (gstreamer newbie).

1 ответ

Решение

На самом деле оказывается, что "gnonlin" слишком низкоуровневый и все еще требует большого знания gstreamer. К счастью, есть "gstreamer- edit -services" ( gst-edit-services), которая представляет собой библиотеку, предлагающую API более высокого уровня поверх gstreamer и gnonlin.

С небольшим чтением RTFM и полезным постом в блоге с примером Python я смог решить свою основную проблему:

  1. Загрузить актив (видео)
  2. Создайте временную шкалу с одним слоем
  3. добавьте ресурс несколько раз к слою, отрегулировав начало, начало и длительность, чтобы в выходном видео присутствовали только соответствующие части видео

Большая часть моего кода взята непосредственно из упомянутого выше поста в блоге, поэтому я не хочу оставлять здесь все это. Соответствующие вещи это:

    asset = GES.UriClipAsset.request_sync(source_uri)
    timeline = GES.Timeline.new_audio_video()
    layer = timeline.append_layer()

    start_on_timeline = 0
    start_position_asset = 10 * 60 * Gst.SECOND
    duration = 5 * Gst.SECOND
    # GES.TrackType.UNKNOWN => add every kind of stream to the timeline
    clip = layer.add_asset(asset, start_on_timeline, start_position_asset,
        duration, GES.TrackType.UNKNOWN)

    start_on_timeline = duration
    start_position_asset = start_position_asset + 60 * Gst.SECOND
    duration = 20 * Gst.SECOND
    clip2 = layer.add_asset(asset, start_on_timeline, start_position_asset,
        duration, GES.TrackType.UNKNOWN)
    timeline.commit()

Полученное видео включает в себя сегменты 10:00–10:05 и 11:05-11:25, поэтому по сути есть два разреза: один в начале и один в середине.

Из того, что я видел, это работало отлично, аудио и видео синхронизированы, не заботясь о ключевых кадрах и еще много чего. Единственная оставшаяся часть - выяснить, могу ли я перевести "номер кадра" во временную привязку для служб редактирования gst.

Другие вопросы по тегам