[我发现这个问题大约一年前才问过一次,但是没有得到回答,所以我又问了一次(不确定最佳实践是创建一个新问题还是将现有问题“撞掉”)。 ]
我有一个Xamarin Forms应用程序,该应用程序正在通过HTTP接收JPEG流,并且我想继续使用其内容更新单个Image占位符。设计上,我接收图像的帧速率非常慢(最多5 fps),因为这是用于延时摄影项目。我希望能够以动画形式显示这些静止图像(想像一下:每小时拍摄一次植物的照片,然后“播放”所有静止图像以创建该植物的生动动画)。
我遇到的问题是“闪烁”,同时将一个图像换成另一个。我尝试了多种方法,包括拥有两个Image(一次可见),并且仅在完成加载最新图像后才更改可见性(我认为这可能是天真的双重缓冲形式?)。还研究了Motion JPEG,HTTP Keep-Alive,甚至使用WebView(我有一个可以读取的有效Motion JPEG端点)。无论如何,到目前为止,我所发现的任何东西都无法减少闪烁,因此,由于缺少更好的放置方法,剧照之间的瞬间有空白(白色)窗格,因此剧照的“动画”仍然非常“生涩”。坦白地说,它看起来像胡扯。
这是获取下一个“帧”并更新“玩家”图像的代码要点:
var url = $"{API_BASE_URL}/{SET_ID}/{_filenames[_currentFilenameIndex]}";
var imageBytes = await Task.Run(() => _httpClient.GetByteArrayAsync(url));
var imageBytesStream = new MemoryStream(imageBytes);
var timeComponents = _filenames[_currentFilenameIndex].Split('T')[1].Split('.')[0].Split('-');
var timeText = $"{timeComponents[0]}:{timeComponents[1]}:{timeComponents[2]}";
Device.BeginInvokeOnMainThread(
() =>
{
TimePlaceholder.Text = $"{timeText} (Image {_currentFilenameIndex + 1}/{_filenames.Count})";
ImagePlaceholder.Source = ImageSource.FromStream(() => imageBytesStream);
});
任何建议将不胜感激。