【问题标题】:ffmpeg only records 6 seconds of videoffmpeg 只录制 6 秒的视频
【发布时间】:2018-04-12 14:34:28
【问题描述】:

我正在尝试从采集卡录制视频。因为我希望我的程序控制 ffmpeg,所以我在 Java 中启动了一个进程,让 ffmpeg 运行 30 秒,然后通过向进程发送“q”来关闭它。然而,视频只有 6 秒长。我在我的代码中找不到任何错误,希望能得到一些帮助

我的代码:

import java.io.*;

public class FfmpegTest {
    public static void main(String[] args) throws Exception {
        Process process = Runtime.getRuntime().exec("E:\\ffmpeg\\bin\\ffmpeg.exe -y -f dshow -i video=\"The video card\" bla.mp4");
        PrintWriter pw = new PrintWriter(process.getOutputStream(),true);

        Thread.sleep(30000);
        System.out.println("recording done");
        pw.println("q");
        Thread.sleep(2000);
    }
}

【问题讨论】:

  • 为什么会这样?你的方法似乎是一个黑客。相反,您可以指定 -t 30 让 ffmpeg 编码 30 秒。
  • 我想录多久就录多久。没有指定我要预先录制多长时间
  • 这在您的示例中没有显示,其中 30 秒的限制是硬编码的。如果您暂停 30 + x 秒,ffmpeg 是否录制 6 + x 秒?设置编码过程可能会有延迟。
  • 硬编码的 30 秒仅用于测试目的。最后,我想保留对 OutputStream 的引用并向其发送“q”

标签: java ffmpeg video-capture


【解决方案1】:

好的,我想通了。视频只有 6 秒长的原因是 ffmpeg 有很多输出,6 秒后就满了。由于输出没有去任何地方,他们堵塞了缓冲区,ffmpeg 停止记录。

要解决此问题,您可以执行以下两项操作之一:

  1. 跨出一个新线程来读取消息以清空流缓冲区
  2. 使用-loglevel quiet 抑制输出消息。如果您需要在流中查找特定消息,这可能是不需要的

【讨论】:

  • 是的,你是对的。找到了解决方案并更新了我的答案
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多