Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android摄像头视频帧解码出现水平线失真_Android_Xamarin_Video_Ffmpeg_Yuv - Fatal编程技术网

Android摄像头视频帧解码出现水平线失真

Android摄像头视频帧解码出现水平线失真,android,xamarin,video,ffmpeg,yuv,Android,Xamarin,Video,Ffmpeg,Yuv,我一直在移植下面的测试Android示例,以便在一个简单的XamarinAndroid项目中运行 我正在通过这条管道运行摄像机(在同一台设备上)捕获的视频,但我从另一端取出的PNG被扭曲了,我假设是由于Android摄像机颜色空间的雷区 这是我通过管道运行摄像头视频时得到的图像 这很难说,但它“有点”看起来像是一条实际图像的直线,延伸到另一边。但老实说,我不想指望这是一个问题,因为它可能是一个红鲱鱼 然而,当我运行一个通过同一管道在线抓取的“普通”视频时,它完全可以正常工作 我使用了在这里找

我一直在移植下面的测试Android示例,以便在一个简单的XamarinAndroid项目中运行

我正在通过这条管道运行摄像机(在同一台设备上)捕获的视频,但我从另一端取出的PNG被扭曲了,我假设是由于Android摄像机颜色空间的雷区

这是我通过管道运行摄像头视频时得到的图像

这很难说,但它“有点”看起来像是一条实际图像的直线,延伸到另一边。但老实说,我不想指望这是一个问题,因为它可能是一个红鲱鱼

然而,当我运行一个通过同一管道在线抓取的“普通”视频时,它完全可以正常工作

我使用了在这里找到的第一个视频(乐高玩具)

我有这样的画面

查看视频的一些ffmpeg探测数据时,此视频和我的相机视频都具有相同的像素格式(pix_fmt=yuv420p),但颜色范围存在差异

有效的视频

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播放,是否会发出警告?