- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Scala 中有以下代码:
val pos = new PipedOutputStream()
val pis = new PipedInputStream(pos)
Future {
LOG.trace("Start rendering")
generateFrames(videoRenderParams.length) {
img ⇒ ImageIO.write(img, "PNG", pos)
}
pos.flush()
IOUtils.closeQuietly(pos)
LOG.trace("Finished rendering")
} onComplete {
case Success(_) ⇒
LOG.trace("Complete successfully")
case Failure(err) ⇒
LOG.error("Can't render stuff", err)
IOUtils.closeQuietly(pis)
IOUtils.closeQuietly(pos)
}
val prc = (ffmpegCli #< pis).!(logger)
Future 只是将生成的图像一张一张地写入OutputStream。现在,ffmpeg 进程从 stdin 读取输入图像并将它们转换为 MP4 文件。
效果很好,但出于某种原因,有时我会得到以下堆栈跟踪:
I/O error Pipe closed for process: <input stream>
java.io.IOException: Pipe closed
at java.io.PipedInputStream.checkStateForReceive(PipedInputStream.java:260)
at java.io.PipedInputStream.receive(PipedInputStream.java:226)
at java.io.PipedOutputStream.write(PipedOutputStream.java:149)
at scala.sys.process.BasicIO$.loop$1(BasicIO.scala:236)
at scala.sys.process.BasicIO$.transferFullyImpl(BasicIO.scala:242)
at scala.sys.process.BasicIO$.transferFully(BasicIO.scala:223)
at scala.sys.process.ProcessImpl$PipeThread.runloop(ProcessImpl.scala:159)
at scala.sys.process.ProcessImpl$PipeSource.run(ProcessImpl.scala:179)
同时我从另一个流中收到以下错误:
javax.imageio.IIOException: I/O error writing PNG file!
at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1168)
at javax.imageio.ImageWriter.write(ImageWriter.java:615)
at javax.imageio.ImageIO.doWrite(ImageIO.java:1612)
at javax.imageio.ImageIO.write(ImageIO.java:1578)
at
所以似乎流在两者之间的某个地方中断了,所以 ffmpeg 无法读取数据,ImageIO 也无法写入数据。
更有趣的是 - 该问题只能在某些 Linux 服务器(亚马逊)上重现。它在其他 Linux 机器上完美运行。所以我想知道是否有人可以指出导致此错误的可能原因。
到目前为止我尝试了什么:
目前没有任何效果。
最佳答案
这个问题既可以预见又很奇怪。因此,安排了十个并发的 ffmpeg 进程来处理输入,而输入是一组数百张 FullHD 图片。显然这需要大量的计算能力,因此内核随机关闭 ffmpeg 进程,导致 Java 包装器同时报告损坏的输入和输出管道。
因此 /var/log/messages 包含许多如下日志:
Out of memory: Kill process 25778 (java) score 159 or sacrifice child
Killed process 25931 (ffmpeg) total-vm:2337040kB, anon-rss:966340kB, file-rss:104kB
减少并发 ffmpeg 进程的数量解决了这个问题。
关于scala - PipedInputStream/PipedOutputStream、ImageIO 和 ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712315/
我正在使用java管道将数据(outstream)从解压模块(JavaUncompress类)传递到解析模块(处理类),文件很大,我想先解压文件并直接解析而不是保存解压缩的文件,然后解析。但是,它仅适
我可以为多线程使用一个 pipedoutputstream 并将其连接到一个 pipedinputstream,然后从多线程获取所有输出吗? 以下是代码片段,我想要的是修改和删除线程的输出可以用于同步
我正在使用管道输出流将 OutputStream 转换为 InputStream 因为 AWS java sdk 不允许使用 OutputStreams 我正在使用下面的代码,但是,这会间歇性地挂起。
我的目标是: 从 S3 读取文件, 更改其元数据 再次推送到S3 AWS java SDK 不允许推送输出流。因此,我必须将 outputstream 从 step2 转换为 inputstream。
我正在学习 java PipedInputStream/PipeOutputStream 。 我想读取标准输入(下面的“Source”类)并将其重定向到一个进程(此处为“grep A”),Grep 的
我正在尝试使用 PipedInputStream 和 PipedOutputStream 实现一个线程循环缓冲区,但每次当我进入 Decoder runnable 中的 mHead.write 时它都
我在 SO 上看到了两个答案,它们声称 Java 提供的 PipedInputStream 和 PipedOutputStream 类存在缺陷。但他们没有详细说明他们出了什么问题。他们真的有缺陷吗?如
当我尝试将 OutputStream 复制到 InputStream 时,我偶然发现了 PipedOutputStream 的一个非常奇怪的行为。另请参阅How to write an nt:file
我在 Java 中使用 PipedOutputStream 和 PipedInputStream。 一个线程正在生成字节并写入它们;另一个正在消耗它们。 我想确保生成字节的速度不会明显快于消耗字节的速
什么是管道流的用例?为什么不将数据读入缓冲区然后将它们写出呢? 最佳答案 BlockingQueue 或类似的集合可能会更好地为您服务,它们是线程安全的、健壮的并且扩展性更好。 关于java - Pi
我正在编写一个简单的 Swing GUI,其中包含一个用于打印调试消息和异常的文本字段。我目前在写入 PipedOutputStream 的地方设置了它,并且我有一个守护线程,它从连接的 PipedI
我有一个数据生成器,它在单独的线程中运行并将生成的数据推送到连接到 PipedInputStream 的 PipedOutputStream 中。此输入流的引用通过公共(public) API 公开,
PipedOutputStream的Android实现 write(byte[] buffer, int offset, int count) 是根据write(byte oneByte)实现的。更具
我有一个具有单读者线程模型的多写入线程。ThreadMultipleDateReceiver 类设计用于从多个线程读取。 public class ThreadMultipleDateReceiver
我在 Scala 中有以下代码: val pos = new PipedOutputStream() val pis = new PipedInputStream(pos)
我已经使用 JTextArea 开发了一个小型控制台。我阅读了一些教程并了解了一些东西。但我仍然有问题。这是我的代码。 public class Console extends JFrame {
如何正确完成管道输出端的工作?我需要写入线程终止或做一些其他工作,而读取线程读取所有写入数据直到结束。 我应该在写入端关闭管道还是什么? 更新 1 我想澄清一下......根据给定的答案,我认为设计管
我想使用 PipedOutputStream 和 PipedInputStream Java 类编写类似于Producer Consumer Problem 的示例。 注意:这是应用其原理的小示例。
我最近发现了这个成语,我想知道我是否遗漏了什么。我从未见过它使用过。我在野外使用过的几乎所有 Java 代码都倾向于将数据放入字符串或缓冲区中,而不是像这个示例(例如使用 HttpClient 和 X
我正在向 PipedOutputStream 写入一些数据,该数据已连接到 PipedInputStream,并将其传递给某些第三方 API。写入 PipedOutputStream 是在另一个线程上
我是一名优秀的程序员,十分优秀!