我正在构建一个流媒体服务器,gstreamer可以按顺序渲染图像帧,有些png图像渲染得很好,有些则没有(autovideosink中显示黑屏),管道在末尾崩溃,出现segfault。
$ gst-launch-1.0 imagesequencesrc location="testImage%d.png" start-index=0 stop-index=4 framerate=1/1 ! decodebin ! videoconvert ! autovideosink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Got context from element 'autovideosink0': gst.gl.GLDisplay=context, gst.gl.GLDisplay=(GstGLDisplay)"\(GstGLDisplayCocoa\)\ gldisplaycocoa0";
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Redistribute latency...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:05.005155000
Setting pipeline to NULL ...
Freeing pipeline ...
Caught SIGSEGV
有趣的是,在Mac上的预览中打开,然后重新保存的图像总是工作正常,即使它们的原始格式导致崩溃。当这些图像单独通过管道成功,没有任何错误。我最好的猜测是有关于这些图像文件损坏的东西,但我不确定如何诊断是什么导致了这个问题。
有趣的是,在Go语言中用下面的代码将这些有问题的图片重新绘制成较小的尺寸并没有解决这个问题,我们仍然看到了崩溃。
paths := [...]string{"testImage0.png", "testImage1.png"}
for index, element := range paths {
file, err := os.Open(element)
if err != nil {
panic(err)
}
img, _, err := image.Decode(bufio.NewReader(file))
if err != nil {
panic(err)
}
// Get the size of the
bounds := img.Bounds()
w := bounds.Dx()
h := bounds.Dy()
fmt.Printf("width: %d, height: %d\n", w, h)
output, _ := os.Create(fmt.Sprintf("testResized%d.png", index))
defer output.Close()
// Set the expected size that you want:
dst := image.NewRGBA(image.Rect(0, 0, img.Bounds().Max.X/2, img.Bounds().Max.Y/2))
// Resize:
draw.NearestNeighbor.Scale(dst, dst.Rect, img, img.Bounds(), draw.Over, nil)
// Encode to `output`:
png.Encode(output, dst)
}
此处提供正常和损坏的图像数据以供参考:https://filetransfer.io/data-package/KW2yDoO6#link。损坏的数据显示在testImage1.png
中。
1条答案
按热度按时间juud5qan1#
你正在“流式传输”代表一幅图像的数据块。这是一个图像帧,其中25(或其他)制作一秒钟的视频。如果数据块在接收到的图像和处理并显示它所需的时间之间不同步,你会得到一个部分或boken图像。这种情况可能发生,因为两个设备没有发送和接收并处理图像(帧)以完全相同的速率。您可以降低帧速率以减少处理器开销,从而减少数据负载。