目标:将Android相机流式传输到Wowza服务器,无论设备的方向如何(即视频始终正面朝上)。
我已经查看了这里关于相机方向的所有问题,到目前为止它们似乎都只是改变了呈现在屏幕上的预览或在MP4文件中设置了一个标志(不适用于我的用例:流媒体)。
我正在将相机帧流式传输到Wowza服务器,在Wowza服务器上接收到的视频始终是横向的。如果手机始终保持相同的方向,则没有问题,但我不能保证我的用户会这样做。据我所知,当您直接从相机获取帧并将其提供给编码器时,您正在获得设备相机的自然方向(在我的情况下可能安装为横向),这完全不受预览的影响。这是有问题的,因为如果在流程中旋转设备,则图像也会随之旋转。
我尝试使用openGL矩阵将预览转换为自定义GLSurfaceView.Renderer中的内容,但它只是转换屏幕上的视图,而不是发送到编码器的帧。
我已阅读Grafika的示例,但不确定在将帧提供给编码器之前需要在哪个阶段旋转它们。我正在使用SurfaceTexture作为相机预览,然后将其渲染到GLSurfaceView上(并使用自己的自定义GLSurfaceView.Renderer)。
如何将帧旋转到编码器中?
理想情况下,我会在openGL中完成这项工作。我曾考虑过在填充mediacodec.dequeueInputBuffer缓冲区之前旋转帧,但这将使用CPU,由于实时应用程序的原因,我有所顾虑。也许我在预览方面忽略了一些东西。我已看到其他广播应用程序在设备旋转时拆除UI上的预览层并重新构建它。
参考资料:
我已经查看了这里关于相机方向的所有问题,到目前为止它们似乎都只是改变了呈现在屏幕上的预览或在MP4文件中设置了一个标志(不适用于我的用例:流媒体)。
我正在将相机帧流式传输到Wowza服务器,在Wowza服务器上接收到的视频始终是横向的。如果手机始终保持相同的方向,则没有问题,但我不能保证我的用户会这样做。据我所知,当您直接从相机获取帧并将其提供给编码器时,您正在获得设备相机的自然方向(在我的情况下可能安装为横向),这完全不受预览的影响。这是有问题的,因为如果在流程中旋转设备,则图像也会随之旋转。
我尝试使用openGL矩阵将预览转换为自定义GLSurfaceView.Renderer中的内容,但它只是转换屏幕上的视图,而不是发送到编码器的帧。
我已阅读Grafika的示例,但不确定在将帧提供给编码器之前需要在哪个阶段旋转它们。我正在使用SurfaceTexture作为相机预览,然后将其渲染到GLSurfaceView上(并使用自己的自定义GLSurfaceView.Renderer)。
如何将帧旋转到编码器中?
理想情况下,我会在openGL中完成这项工作。我曾考虑过在填充mediacodec.dequeueInputBuffer缓冲区之前旋转帧,但这将使用CPU,由于实时应用程序的原因,我有所顾虑。也许我在预览方面忽略了一些东西。我已看到其他广播应用程序在设备旋转时拆除UI上的预览层并重新构建它。
参考资料:
Sprite2d#recomputeMatrix()
。 - fadden