我一直在移植以下Test Android示例,以便在简单的Xamarin Android项目中运行。
https://bigflake.com/mediacodec/ExtractMpegFramesTest_egl14.java.txt
我正在通过此管道运行由相机(在同一设备上)捕获的视频,但是我从另一端发出的PNG是扭曲的,我假设由于Android Camera颜色空间的雷区。
以下是我通过管道运行相机视频的图像...
很难说,但它有点'看起来像是实际图像的单行,横跨。但老实说,我不想在这个问题上存在问题,因为它可能是一个红色的鲱鱼。
但是,当我运行通过同一管道在线抓取的“普通”视频时,它完全正常。
我使用了这里发现的第一个视频(lego one)http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5
我得到这样的帧......
检查视频的一些ffmpeg探测数据,这个和我的相机视频都有相同的像素格式(pix_fmt = yuv420p),但color_range有差异。
有效的视频,
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
相机视频刚刚......
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
摄像机视频的媒体格式似乎在SemiPlanar 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表面,只需抓住Bitmap(明显更慢)并且这些帧看起来很好。也许它的原始编解码器输出的OpenGL显示? Android TextureView是否可以解码?
注意 - 我正在调查所有这些的原因是我需要尝试在原始相机上以尽可能接近30fps的速度运行某种形式的图像处理。显然,这不可能是某些设备,但以30fps录制视频然后处理视频后事实是我正在调查的可能的解决方法。我宁愿尝试在OpenGL中处理图像,以提高速度,而不是从TextureView输出中将每个帧作为位图。
在研究这个问题时,我看到其他人在这里遇到了完全相同的问题How to properly save frames from mp4 as png files using ExtractMpegFrames.java? 虽然他似乎没有太多运气找出可能出错的地方。
编辑 - 两个视频的FFMpeg探测输出......
视频有效 - https://justpaste.it/484ec 视频失败 - https://justpaste.it/55in0。