新版的IMediaStreamActionNotify 接口 IMediaStreamActionNotify3 增加了对以下功能的支持:
void onCodecInfoVideo(IMediaStream stream, MediaCodecInfoVideo codecInfoVideo); void onCodecInfoAudio(IMediaStream stream, MediaCodecInfoAudio codecInfoAudio);
这个新的事件将监听音视频流的编码信息。
package test; import com.wowza.wms.amf.*; import com.wowza.wms.application.*; import com.wowza.wms.module.*; import com.wowza.wms.stream.*; import com.wowza.wms.media.model.*; public class ModuleMediaStreamActionNotify3Example extends ModuleBase { class StreamListener implements IMediaStreamActionNotify3 { public void onMetaData(IMediaStream stream, AMFPacket metaDataPacket) { System.out.println("onMetaData[" + stream.getContextStr() + "]: " + metaDataPacket.toString()); } public void onPauseRaw(IMediaStream stream, boolean isPause, double location) { System.out.println("onPauseRaw[" + stream.getContextStr() + "]: isPause:" + isPause + " location:" + location); } public void onPause(IMediaStream stream, boolean isPause, double location) { System.out.println("onPause[" + stream.getContextStr() + "]: isPause:" + isPause + " location:" + location); } public void onPlay(IMediaStream stream, String streamName, double playStart, double playLen, int playReset) { System.out.println("onPlay[" + stream.getContextStr() + "]: playStart:" + playStart + " playLen:" + playLen + " playReset:" + playReset); } public void onPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend) { System.out.println("onPublish[" + stream.getContextStr() + "]: isRecord:" + isRecord + " isAppend:" + isAppend); } public void onSeek(IMediaStream stream, double location) { System.out.println("onSeek[" + stream.getContextStr() + "]: location:" + location); } public void onStop(IMediaStream stream) { System.out.println("onStop[" + stream.getContextStr() + "]: "); } public void onUnPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend) { System.out.println("onUnPublish[" + stream.getContextStr() + "]: streamName:" + streamName + " isRecord:" + isRecord + " isAppend:" + isAppend); } public void onCodecInfoAudio(IMediaStream stream, MediaCodecInfoAudio codecInfoAudio) { System.out.println("onCodecInfoAudio[" + stream.getContextStr() + " Audio Codec" + codecInfoAudio.toCodecsStr() + "]: "); } public void onCodecInfoVideo(IMediaStream stream, MediaCodecInfoVideo codecInfoVideo) { System.out.println("onCodecInfoVideo[" + stream.getContextStr() + " Video Codec" + codecInfoVideo.toCodecsStr() + "]: "); } } public void onStreamCreate(IMediaStream stream) { getLogger().info("onStreamCreate["+stream+"]: clientId:" + stream.getClientId()); IMediaStreamActionNotify2 actionNotify = new StreamListener(); WMSProperties props = stream.getProperties(); synchronized (props) { props.put("streamActionNotifier", actionNotify); } stream.addClientListener(actionNotify); } public void onStreamDestroy(IMediaStream stream) { getLogger().info("onStreamDestroy["+stream+"]: clientId:" + stream.getClientId()); IMediaStreamActionNotify2 actionNotify = null; WMSProperties props = stream.getProperties(); synchronized (props) { actionNotify = (IMediaStreamActionNotify2) stream.getProperties().get("streamActionNotifier"); } if (actionNotify != null) { stream.removeClientListener(actionNotify); getLogger().info("removeClientListener: " + stream.getSrc()); } } }