视频播放器内置CollectionView项添加导致视频帧混乱Xamarin表单
我有一个视频播放器内置CollectionView项添加导致视频帧混乱Xamarin表单,xamarin,xamarin.forms,avplayer,collectionview,Xamarin,Xamarin.forms,Avplayer,Collectionview,我有一个CollectionView,它的DataTemplate中有一个VideoPlayer元素,该元素取自。在iOS上,渲染的视频播放器使用AVPlayer播放视频。 我还有一个按钮,按下该按钮时,会将更多项目添加到CollectionView的ItemSource。 如果我播放第一个,比如说,三个项目,并在随机帧/时间上暂停它们,然后按下“添加更多项目”按钮,iPhone上这三个AVPlayer实例上的冻结图像帧会以某种奇怪的顺序被洗牌/切换。 更详细地说: 如果收藏视图的第一个项目暂停
CollectionView
,它的DataTemplate
中有一个VideoPlayer
元素,该元素取自。在iOS上,渲染的视频播放器使用AVPlayer
播放视频。
我还有一个按钮,按下该按钮时,会将更多项目添加到CollectionView
的ItemSource
。
如果我播放第一个,比如说,三个项目,并在随机帧/时间上暂停它们,然后按下“添加更多项目”按钮,iPhone上这三个AVPlayer
实例上的冻结图像帧会以某种奇怪的顺序被洗牌/切换。
更详细地说:
如果收藏视图
的第一个项目暂停了一些动画视频,第二个项目暂停了一些体育游戏视频,第三个项目暂停了一些森林图像视频,当我按下添加更多项目按钮时,一些新项目会添加到收藏视图
的项目源
,我看到体育游戏视频帧移动到第一个项目的AVPlayer
实例,森林图像视频帧移动到第二个项目的AVPlayer
实例,动画帧移动到第三个项目的AVPlayer
实例。为了澄清:项目本身保持在其确切位置,只有AVPlayer中的视频帧被切换
在这些被“洗牌”之后,如果我取消第一个项目的暂停,它将播放其原始的动画视频,第二个和第三个项目也是如此。据我所知,唯一的问题是在CollectionView
的缓存/单元重用机制中的某个地方,当新项目添加到CollectionView
时,AVPlayer
的缓存帧会按一定顺序切换。
此问题仅发生在AVPlayer
上。任何其他元素都不会重现此行为。我尝试过ffimageloading的CahcedImage
、简单标签和其他元素,但只有AVPlayer的
渲染的暂停帧图像会被洗牌。
我意识到这个问题可能有一些深层次的根源,在Xamarin表单级别上无法解决,但我只是想在这里碰碰运气
我的CollectionView代码非常基本:
<CollectionView ItemsSource="{Binding ScrollArticles}"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
RemainingItemsThreshold="5"
RemainingItemsThresholdReachedCommand="{Binding LoadMoreItems}"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand"
ItemsLayout="VerticalList"
x:Name="CategoryItemsListView"
VerticalScrollBarVisibility="Always"
Scrolled="CategoryItemsListView_OnScrolled"
>
<CollectionView.ItemTemplate>
<DataTemplate>
<elements:VideoPlayer Margin="0,0,0,15" Source={Binding video_url}>
</elements:VideoPlayer>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
当使用任何其他元素(例如图像
)替换视频播放器
元素时,相同的精确代码会正常工作。
另一件事是相同的
VideoPlayer
代码在ListView
内部实现时(使用CachingStrategy=RecycleElement
)而不是CollectionView
)不会执行此操作。但不幸的是,ListView
缺少很多功能,例如在滚动时确定最中间的项目等。您能与我们分享您的测试项目吗?我试图在我这边重现这个问题,但我失败了。嗨,我会在我完成当前项目后尝试这样做。不幸的是,出于最后期限的考虑,我被迫切换到ListView,因为对于相同的代码,它没有相同的错误。好的,一旦您有时间共享测试项目,我将进行检查:)。您可以与我们共享您的测试项目吗?我试图在我这边重现这个问题,但我失败了。嗨,我会在我完成当前项目后尝试这样做。不幸的是,出于最后期限的考虑,我被迫切换到ListView,因为它对于相同的代码没有相同的错误。好的,一旦您有时间共享测试项目,我将检查:)。