使用gstreamer / Python剪切部分视频(gnonlin?)

时间:2014-02-02 16:55:03

标签: python video gstreamer python-gstreamer gnonlin

我有一个视频文件,我想剪掉一些场景(由时间位置或帧识别)。据我所知,gnonlin应该是可能的,但到目前为止,我无法找到一个示例如何(理想情况下使用Python)。如果可能,我不想修改视频/音频部分(但可以接受转换为mp4 / webm)。

我是否认为gnonlin是gstreamer宇宙中正确的组成部分?此外,我很高兴能找到一些如何处理问题的指针/食谱(gstreamer newbie)。

1 个答案:

答案 0 :(得分:1)

实际上事实证明"gnonlin" is too low-level并且仍然需要很多gstreamer知识。幸运的是,有一个“gstreamer-editing-services”(gst-editing-services) 库在gstreamer和gnonlin之上提供更高级别的API。

只需要RTFM readinghelpful blog post with a Python example,我就可以解决我的基本问题:

  1. 加载资产(视频)
  2. 使用单个图层创建时间轴
  3. 将资产多次添加到图层,调整开始,入点和持续时间,以便输出视频中只显示视频的相关部分
  4. 我的大多数代码都是直接从上面引用的博客文章中获取的,因此我不想在此处转储所有内容。相关的东西是:

        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编辑服务的时间参考。