代码之家  ›  专栏  ›  技术社区  ›  jg_1992

无法在java代码中拍摄视频截图

  •  0
  • jg_1992  · 技术社区  · 10 年前

    我用vlcj编写了一段代码,旨在定期拍摄视频截图。当我尝试输出视频的长度时,它会输出0。问题是什么?

    import uk.co.caprica.vlcj.binding.LibVlc;
    import uk.co.caprica.vlcj.player.MediaPlayerFactory;
    import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
    import uk.co.caprica.vlcj.runtime.RuntimeUtil;
    
    import com.sun.jna.Native;
    import com.sun.jna.NativeLibrary;
    
    public class ScreenShotCapture {
    
        public static void main(String[] args){
            NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC");
            Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
            MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
            final EmbeddedMediaPlayer mediaPlayer =mediaPlayerFactory.newEmbeddedMediaPlayer();
            mediaPlayer.playMedia("E:\\videos\\Avenged Sevenfold - So Far Away [Music Video].mp4");
            mediaPlayer.setSnapshotDirectory("E:\\vidoes");
            long length = mediaPlayer.getTime();
            long interval = length / 21;
            for(long  i = 1;i <= length;i+= interval){
                mediaPlayer.setTime(i);
                mediaPlayer.saveSnapshot();
            }
        }
    }
    
    2 回复  |  直到 10 年前
        1
  •  2
  •   caprica    10 年前

    媒体长度不是立即可用的,它将在媒体开始播放后的一段时间内可用,当解码器计算出长度时。这就是VLC的固有工作方式。

    几乎所有的工作都是异步的,这意味着您必须将代码基于事件,而不是仅以过程方式编写代码。

    当长度更改时,将生成本机事件,最终导致 MediaPlayerEventListener#lengthChanged 要启动的事件。当该事件激发后 mediaPlayer.getLength() 应返回非零值。

    下一个问题是调用 saveSnapshot 调用后立即 setTime 再一次 setTime(设置时间) 异步工作,因此当该方法返回时,您不能假设媒体播放器已达到所需的时间。你必须等待 timeChanged 事件,并检查您的时间是否已到(实际已过)。

    最后一个问题是,调用 saveSnapshot(保存快照) 它本身是异步的,因此本质上您请求了快照,但尚未生成。这次你需要等待 snapshotTaken 事件只有当接收到该事件时,快照才实际保存到磁盘。

    因此,基本上,您需要以不同的方式思考并实施基于事件的方法。

    其中一个例子是生成快照的vlcj示例: https://github.com/caprica/vlcj/blob/vlcj-3.0.1/src/test/java/uk/co/caprica/vlcj/test/condition/ConditionTest.java

    如果你不喜欢这个例子,那么你可以通过自己的事件来实现它 MediaPlayerEventListener 实施

    另外:您还可以使用VLC“场景”过滤器以可靠的方式生成快照。

        2
  •  0
  •   timbo    10 年前

    我想这不是你在设置快照目录时拼写错误造成的吧?