使用情景:
视频建立以后,发送方很有可能会随意旋转设备的方向,这样其采集的数据也是旋转过的,到了接收方后,显示就会有问题(如,颠倒等)。为了维护发送方和接收方能够实时的同步视频方向,会话需要协同它们的方向步调。
如果需要支持该功能,需要在发送方invite消息的SDP协议消息中加入以下属性:
a=extmap:7 urn:3gpp:video-orientation,接收方收到以后,也会在响应中加入该tag属性,这样就完成了该功能的协商。Tag中的7是扩展数据帧的扩展id,可以是1-15中的任何一个,用来标识该方向数据的位置,具体参考RFC5285。更多描述参考RCC.07- 2.7.1.2.2。以上所述的视频方向其实包含了数据的方向和发送方camera的选项(前置或者后置),为了方便起见,一下都称为视频方向数据。
获取自己的视频方向:
获取自己的视频实时方向,需要用到Android的Display和Surface两个类,通过他们的配合就可以获取出当前camera视频的方向,最终是一个int值。值得注意的是,这两个类获取出来的方向的整数值不一定一样,这需要看设备的环境,比如前后摄像头等。
获取对方的视频方向:
视频发送方将其视频方向进行封装(具体方式见9.3),封装以后,放在视频数据帧的一个扩展位置,然后随视频帧一起打包后通过rtp/rtcp/udp发送给接收方。接收方收到视频帧数据后,可以在帧的扩展位置将视频方向获取出来,然后,在实时的调整到surface view上面。这样,接收方就可以实时的根据发送方的视频方向来调整自己的显示方向。
具体封装打包,参考RFC3550。
视频方向格式及编解码
图9-1是RCC.07- 2.7.1.2.2中定义的rtp帧中的扩展数据,该数据是用一个8位字节进行编码的。前面四位是预留位,用于其他将来用途,后面四位中,从高到低,第一位是视频发送方camera的选项,可编码出2种camera选项;后三位是视频数据的方向,可以编码出8种视频方向。
图 9-1 视频方向数据格式
表9-1 发送方的方向编码
如表9-1所示为视频方向中的前4种旋转编码。
如表9-2所示为camera的2中选项编码。
表9-2 发送方camera选项编码
这样配合图9-1,表9-1和表9-2就可以完成一帧视频数据的方向编解码了,具体如下:
编码:
将camera选项位和视频方向位四位编码后的数据映射成十进制数字,就是该帧方向编码后的整数值了。比如发送方当前是后置摄像头并且视频顺时针旋转了90度,那么四位编码则是1011,转换成十进制就是11,那么接收方通过帧中的扩展位数据得到的就是11。
位运算法则:total = (camera << 3) | orientation。
解码:
接收方的到11后,对应的转换成二进制就是1011,获取第四位就是发送方camera的选项,获取后三位就是视频的方向。
位运算法则:
Camera = (total & 0x08) >> 3;
Orientation = total & 0x07;