腾讯云播放器sdk提供直播场景与点播场景实现。
其他直播场景可以通过onRenderVideoFrame()获取视频帧数据,从而unity3d可通过getData获取视频帧数据完成渲染。
public void onRenderVideoFrame(V2TXLivePlayer player, V2TXLiveDef.V2TXLiveVideoFrame v2TXLiveVideoFrame) {
synchronized(MainActivity.M2) {
try {
ByteArrayCallbackResult r = (ByteArrayCallbackResult)MainActivity.M2.get(name);
if (r != null) {
r.value = v2TXLiveVideoFrame.data;
r.height = v2TXLiveVideoFrame.height;
r.width = v2TXLiveVideoFrame.width;
r.rotation = v2TXLiveVideoFrame.rotation;
}
} catch (Exception var6) {
Log.e("video sdk ", "error " + var6.toString());
}
}
}
点播场景中没有对应的获取视频帧数据的方法,请问如何获取视频帧数据渲染到unity。下面是点播播放器回调通知。
ITXVodPlayListener itxListeer = new ITXVodPlayListener() {
@Override
public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
if (mVodPlayer == null) {
return;
}
if (event + "" == TXVodConstants.EVT_KEY_FRAME_CONTENT_LIST) {
Log.d(TAG, "-------------------------------------------------------针数据------------------------");
}
if (event != TXLiveConstants.PLAY_EVT_PLAY_PROGRESS) {
Log.d(TAG, "-------------------------------------------------------不是播放事件------------------------");
String playEventLog = "receive event: " + event + ", " + param.getString(TXLiveConstants.EVT_DESCRIPTION);
Log.d(TAG, playEventLog);
}
if (event == TXLiveConstants.PLAY_EVT_VOD_LOADING_END) {
Log.d(TAG, "-------------------------------------------------------缓冲完成------------------------");
mIsStopped = true;
}
if (event == TXLiveConstants.PLAY_EVT_VOD_PLAY_PREPARED) {
Log.d(TAG, "-------------------------------------------------------准备播放------------------------");
List<TXBitrateItem> bitrateItems = mVodPlayer.getSupportedBitrates();
int bitrateItemSize = bitrateItems != null ? bitrateItems.size() : 0;
if (bitrateItemSize > 0) {
Collections.sort(bitrateItems); //masterPlaylist多清晰度,按照码率排序,从低到高
}
}
if (event == TXLiveConstants.PLAY_EVT_PLAY_BEGIN) {
Log.d(TAG, "-------------------------------------------------------开始播放------------------------");
//stopLoadingAnimation();
Log.d("AutoMonitor", "PlayFirstRender,cost=" + (System.currentTimeMillis() - mStartPlayTS));
} else if (event == TXLiveConstants.PLAY_EVT_PLAY_PROGRESS) {
Log.d(TAG, "-------------------------播放进程------------------------");
int progress = param.getInt(TXLiveConstants.EVT_PLAY_PROGRESS_MS);
int duration = param.getInt(TXLiveConstants.EVT_PLAY_DURATION_MS);
int playable = param.getInt(TXLiveConstants.EVT_PLAYABLE_DURATION_MS);
return;
} else if (event == TXLiveConstants.PLAY_ERR_NET_DISCONNECT || event == TXLiveConstants.PLAY_EVT_PLAY_END || event == TXLiveConstants.PLAY_ERR_FILE_NOT_FOUND) {
Log.d(TAG, "-------------------------------------------------------网络断开,播放结束,播放文件未找到------------------------");
stopPlayVod();
mVideoPlay = false;
mVideoPause = false;
} else if (event == TXLiveConstants.PLAY_EVT_PLAY_LOADING) {
Log.d(TAG, "-------------------------------------------------------视频数据缓冲中……------------------------");
// startLoadingAnimation();
} else if (event == TXLiveConstants.PLAY_EVT_RCV_FIRST_I_FRAME) {
Log.d(TAG, "------------------------------------------------------ 网络接收到首个可渲染的视频数据包(IDR)------------------------");
// stopLoadingAnimation();
// findViewById(R.id.playerHeaderView).setVisibility(View.GONE);
// if (mPhoneListener.isInBackground()) {
// mVodPlayer.pause();
// }
} else if (event == TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION) {
Log.d(TAG, "-------------------------------------------------------改变分辨率------------------------");
} else if (event == TXLiveConstants.PLAY_ERR_HLS_KEY) {//HLS 解密 key 获取失败
Log.d(TAG, "-------------------------------------------------------解密 key 获取失败------------------------");
stopPlayVod();
} else if (event == TXLiveConstants.PLAY_WARNING_RECONNECT) {
Log.d(TAG, "-------------------------------------------------------警告重连------------------------");
//startLoadingAnimation();
} else if (event == TXLiveConstants.PLAY_EVT_CHANGE_ROTATION) {
Log.d(TAG, "-------------------------------------------------------改变方向------------------------");
return;
}
if (event < 0) {
Log.d(TAG, "-------------------------------------------------------没有事件------------------------");
// Toast.makeText(getApplicationContext(), param.getString(TXLiveConstants.EVT_DESCRIPTION), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNetStatus(TXVodPlayer txVodPlayer, Bundle bundle) {
//获取当前CPU使用率
CharSequence cpuUsage = bundle.getCharSequence(TXLiveConstants.NET_STATUS_CPU_USAGE);
//获取视频宽度
int videoWidth = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_WIDTH);
//获取视频高度
int videoHeight = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_HEIGHT);
//获取实时速率, 单位:kbps
int speed = bundle.getInt(TXLiveConstants.NET_STATUS_NET_SPEED);
//获取当前流媒体的视频帧率
int fps = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_FPS);
//获取当前流媒体的视频码率,单位 bps
int videoBitRate = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_BITRATE);
//获取当前流媒体的音频码率,单位 bps
int audioBitRate = bundle.getInt(TXLiveConstants.NET_STATUS_AUDIO_BITRATE);
//获取缓冲区(jitterbuffer)大小,缓冲区当前长度为0,说明离卡顿就不远了
int jitterbuffer = bundle.getInt(TXLiveConstants.NET_STATUS_VIDEO_CACHE);
//获取连接的服务器的IP地址
String ip = bundle.getString(TXLiveConstants.NET_STATUS_SERVER_IP);
}
};
相似问题