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

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

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


person Felix Schwarz    schedule 02.02.2014    source источник


Ответы (1)


На самом деле получается, что "gnonlin" слишком низкоуровневый и все равно требует больших знаний gstreamer . К счастью, есть «gstreamer-editing-services» (gst-editing-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.

person Felix Schwarz    schedule 02.02.2014