【问题标题】:Capturing with vlcj only gives a corrupt video file使用 vlcj 捕获只会产生损坏的视频文件
【发布时间】:2012-01-30 17:23:48
【问题描述】:

我正在使用 vlcj 在我的 Java 程序中捕获屏幕。因此我使用以下代码:

public static void main(final String[] args) {
            NativeLibrary.addSearchPath("vlc", "/Applications/VLC.app/Contents/MacOS/lib/");
            SwingUtilities.invokeLater(new Runnable() {
              @Override
              public void run() {
                new CaptureTest().start("screen://");
              }
            });
          }

public CaptureTest() {
            factory = new MediaPlayerFactory();
            mediaPlayer = (HeadlessMediaPlayer) factory.newMediaPlayer();
          }

          private void start(String mrl) {

            File dir = new File(System.getProperty("user.home"), "Videos");
            dir.mkdirs();

            DateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss");
            String fileName =  dir.getAbsolutePath() + "/Capture-" + df.format(new Date()) + ".mp4";

            String[] options = {
            ":sout=#transcode{vcodec=h264,acodec=mp4a}:std{mux=mp4,access=file,dst=" + fileName + "}", ":input-slave=screen://"
            };

            mediaPlayer.playMedia(mrl, options);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mediaPlayer.stop();
            mediaPlayer.release(); 
          }

问题是视频输出文件只有4KB,无法播放。谁能帮我?我在 Mac OS 10.6.8 上,我使用 VLC 1.1.12 和 vlcj 1.1.5

【问题讨论】:

  • 你的意思是你想用 VLC 做截屏?
  • 您是否通过 VLC 命令本身而不是 Java 测试了 :sout 命令选项,以查看它在您的 PC 设置上是否正常工作?
  • 如果不起作用,请尝试以下链接中给出的VLC命令行选项opensource.about.com/od/tutorials/ss/…
  • 如果 :sout 命令选项中的dst 参数的文件名之间有空格,您可能需要将双引号转义如下"dst=\"" + filename + "\""
  • 不,我不想截屏。我想记录我的桌面。我在控制台(Mac OS)上测试了以下内容: /Applications/VLC.app/Contents/MacOS/VLC screen:// --sout="#transcode{vcodec=h264,acodec=mp4a}:std{access=file, mux=mp4,dst=/User/test/Desktop/test.mp4}" 这按预期工作,它记录了我的屏幕。文件名中没有空格。也许你可以给我一个 Java 示例,它可以与 mp4 和 h264 一起使用?

标签: vlc vlcj


【解决方案1】:

这是代码中有趣的部分...

    mediaPlayer.playMedia(mrl, options);
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    mediaPlayer.stop();
    mediaPlayer.release(); 

你为什么播放媒体,睡了 5 秒,然后立即停止?也许,这就是为什么您在屏幕录制期间获得非常小的文件大小的原因。据我所知,转码速度不够快,因此文件的大小不会立即增加(我猜可能是由于在转码部分发生了缓冲...)

最好为播放/录制动作和停止动作分别创建一个按钮。

【讨论】:

  • 不,这绝对不是问题。我自己发现了:我必须在选项数组中添加一个 screen-fps=5.0 选项。在它工作正常之后。
  • 嗯,真的就这么简单吗?因为,在我的示例代码中,我根本不需要设置screen-fps 即可通过 VLCJ 成功录制桌面屏幕。当我运行您的代码时,很明显我向您展示的部分没有正确记录文件,因为它被过早地缩短(运行 5 秒,然后立即停止)。这就是为什么文件只有 4KB 并且无法播放的原因。对于要记录的 640 x480 x 32 像素的单帧,它应至少产生 9MB 大小的未压缩。也许,你忽略了一些事情,在寻找解决你真正问题的方法时迷失了方向。
  • 更正:我忘了除以 8...如果未压缩,它至少应为 1MB (640 x 480 x 32 /8)。 32 位颜色/8 = 4 字节信息乘以帧的分辨率大小...我不知道您录制时的桌面大小..所以,我只是假设 640 x 480。但是 h264 编解码器涉及减少如果发生压缩,信息将帧大小从一种帧状态转换为另一种帧状态。
  • 继续...但是,我不认为它只有 4KB :)
【解决方案2】:

您可能会检查您的 sout 链。我也有视频文件生成的问题。对我来说工作的 sout 链是:

:sout=#transcode{vcodec=mp2v, vb=4096,scale=1, acodec=mpga, ab=128, channels=2, samplerate=44100}
:duplicate{dst=file{dst="+ fileName+"}, dst=display, select=noaudio}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2021-11-27
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2020-05-31
    相关资源
    最近更新 更多