随着VR类、游戏类场景的快速发展,开发者对Unity3d低延迟的直播需求量越来越大,前两年,大牛直播SDK发布了Windows平台、Android平台和iOS平台的Unity3d RTMP和RTSP的播放,好多公司用起来体验都非常好,以下介绍大概实现流程。
本文以Android平台为例,我们的实现:基于大牛直播SDK现有非常成熟的native RTMP和RTSP播放模块,回调解码后的原始数据,传递给Unity3d,实现相应的绘制即可,对应demo,可以参考 Github。
具体步骤如下:
1. Native RTSP或RTSP直播播放SDK回调RGB/YUV420/NV12等其中的一种未压缩的图像格式;
2. Unity3D创建相应的RGB/YUV420等Shader;
3.Unity3D从各个平台获取图像数据来填充纹理即可。
以Android平台为例,我们在原有接口基础上,做了桥接接口,供Unity平台使用:
/// <summary>
/// Init
/// </summary>
public int NT_U3D_Init()
{
return DANIULIVE_RETURN_OK;
}
/// <summary>
/// 开始
/// 返回播放句柄
/// </summary>
public long NT_U3D_Open()
{
if ( 0 != player_obj_.Call<int>("Init", java_obj_cur_activity_) )
{
return 0;
}
return player_obj_.Call<long>("Open");
}
/// <summary>
/// Register Game Object,用于消息传递
/// </summary>
public int NT_U3D_Set_Game_Object(long handle, string gameObjectName)
{
return player_obj_.Call<int>("SetGameObject", handle, gameObjectName);
}
/// <summary>
/// 设置H.264解码方式 false 软件解码 true 硬件解码 默认为false
/// </summary>
/// <param name="isHwDecoder"></param>
public int NT_U3D_SetVideoDecoderMode(long handle, int isHwDecoder)
{
return player_obj_.Call<int>("SetPlayerVideoHWDecoder", handle, isHwDecoder);
}
/// <summary>
/// 设置H.265 解码方式 false 软件解码 true 硬件解码 默认为false
/// </summary>
/// <param name="isHevcHwDecoder"></param>
public int NT_U3D_SetVideoHevcDecoderMode(long handle, int isHevcHwDecoder)
{
return player_obj_.Call<int>("SetPlayerVideoHevcHWDecoder", handle, isHevcHwDecoder);
}
/// <summary>
/// 设置音频输出模式: if 0: 自动选择; if with 1: audiotrack模式
/// </summary>
/// <param name="use_audiotrack"></param>
public int NT_U3D_SetAudioOutputType(long handle, int use_audiotrack)
{
return player_obj_.Call<int>("SetAudioOutputType", handle, use_audiotrack);
}
/// <summary>
/// 设置播放端缓存大小, 默认200毫秒
/// </summary>
/// <param name="buffer"></param>
public int NT_U3D_SetBuffer(long handle, int buffer)
{
return player_obj_.Call<int>("SetBuffer", handle, buffer);
}
/// <summary>
/// 接口可实时调用:设置是否实时静音,1:静音; 0: 取消静音
/// </summary>
/// <param name="is_mute"></param>
public int NT_U3D_SetMute(long handle, int is_mute)
{
return player_obj_.Call<int>("SetMute", handle, is_mute);
}
/// <summary>
/// 设置RTSP TCP模式, 1: TCP; 0: UDP
/// </summary>
/// <param name="is_using_tcp"></param>
public int NT_U3D_SetRTSPTcpMode(long handle, int is_using_tcp)
{
return player_obj_.Call<int>("SetRTSPTcpMode", handle, is_using_tcp);
}
/// <summary>
/// 设置RTSP超时时间, timeout单位为秒,必须大于0
/// </summary>
/// <param name="timeout"></param>
public int NT_U3D_SetRTSPTimeout(long handle, int timeout)
{
return player_obj_.Call<int>("SetRTSPTimeout", handle, timeout);
}
/// <summary>
/// 设置RTSP TCP/UDP自动切换
/// NOTE: 对于RTSP来说,有些可能支持rtp over udp方式,有些可能支持使用rtp over tcp方式.
/// 为了方便使用,有些场景下可以开启自动尝试切换开关, 打开后如果udp无法播放,sdk会自动尝试tcp, 如果tcp方式播放不了,sdk会自动尝试udp.
/// </summary>
/// <param name="timeout"></param>
/// timeout:如果设置1的话, sdk将在tcp和udp之间尝试切换播放,如果设置为0,则不尝试切换.
public int NT_U3D_SetRTSPAutoSwitchTcpUdp(long handle, int is_auto_switch_tcp_udp)
{
return player_obj_.Call<int>("SetRTSPAutoSwitchTcpUdp", handle, is_auto_switch_tcp_udp);
}
/// <summary>