Android摄像头视频帧解码出现水平线失真
我一直在移植下面的测试Android示例,以便在一个简单的XamarinAndroid项目中运行 我正在通过这条管道运行摄像机(在同一台设备上)捕获的视频,但我从另一端取出的PNG被扭曲了,我假设是由于Android摄像机颜色空间的雷区 这是我通过管道运行摄像头视频时得到的图像 这很难说,但它“有点”看起来像是一条实际图像的直线,延伸到另一边。但老实说,我不想指望这是一个问题,因为它可能是一个红鲱鱼 然而,当我运行一个通过同一管道在线抓取的“普通”视频时,它完全可以正常工作 我使用了在这里找到的第一个视频(乐高玩具) 我有这样的画面 查看视频的一些ffmpeg探测数据时,此视频和我的相机视频都具有相同的像素格式(pix_fmt=yuv420p),但颜色范围存在差异 有效的视频Android摄像头视频帧解码出现水平线失真,android,xamarin,video,ffmpeg,yuv,Android,Xamarin,Video,Ffmpeg,Yuv,我一直在移植下面的测试Android示例,以便在一个简单的XamarinAndroid项目中运行 我正在通过这条管道运行摄像机(在同一台设备上)捕获的视频,但我从另一端取出的PNG被扭曲了,我假设是由于Android摄像机颜色空间的雷区 这是我通过管道运行摄像头视频时得到的图像 这很难说,但它“有点”看起来像是一条实际图像的直线,延伸到另一边。但老实说,我不想指望这是一个问题,因为它可能是一个红鲱鱼 然而,当我运行一个通过同一管道在线抓取的“普通”视频时,它完全可以正常工作 我使用了在这里找
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
而摄像机的视频只是
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
摄像机视频的媒体格式似乎是半平面YUV,编解码器输出至少会更新为该格式。我得到一条OutputBuffersChanged消息,该消息将MediaCodec的输出缓冲区设置为:
{
mime=video/raw,
crop-top=0,
crop-right=639,
slice-height=480,
color-format=21,
height=480,
width=640,
what=1869968451,
crop-bottom=479,
crop-left=0,
stride=640
}
我还可以将编解码器输出指向TextureView,而不是OpenGL surface,然后以这种方式抓取位图(明显较慢),这些帧看起来很好。那么可能是OpenGL显示原始编解码器输出?Android TextureView的解码功能是否正常
注意-我之所以要研究这一切,是因为我需要尝试以尽可能接近30fps的速度在原始摄影机提要上运行某种形式的图像处理。显然,这在某些设备上是不可能的,但我正在调查的一个可能的解决办法是以30fps的速度录制视频,然后在事后处理视频。为了提高速度,我宁愿尝试在OpenGL中处理图像,也不愿从TextureView输出中将每一帧作为位图
在研究这一点的过程中,我看到其他人也有同样的问题
虽然他似乎没有太多的运气发现可能出了什么问题
编辑-两个视频的FFMpeg探测输出
有效的视频-。失败的视频- 这不是一个颜色空间问题-这只会导致不同的颜色,而不是扭曲的图像定义。这与像素格式有关,即数据布局,虽然不是Android/Java开发人员,但不能直接帮助您。干杯,帮助我缩小范围!因此,两个视频(显然)都有相同的像素格式,根据ffmpeg probe的说法是“yuv420p”。我是否应该查看其他元数据参数来确定它们之间的真正区别?以下是完整的ffmpeg探测结果,视频有效-。视频不起作用-。问题发生在早期阶段,因此ffprobe不会有帮助。我的猜测是步幅或分量交错错误地传递或设置在某个地方。ffprobe在传递到任何东西之前都是原始视频文件的一部分。视频可以在我的电脑上以VLC或Quicktime或其他方式播放。失败的视频是由手机上的摄像头录制的,但播放Back 100%正常。如果使用ffplay播放,是否会发出警告?