//此方法是转为流形式,serverAddress,serverPort都是属于转后发布的地址和端口,id是后缀,当多个流转为一个发布地址时,增加此参数避免发布地址重复。
private static String formatHttpStream(String serverAddress, int serverPort, String id) {StringBuilder sb = new StringBuilder(60);
sb.append(":sout=#transcode{vcodec=theo,vb=2200,scale=1,acodec=vorb,ab=32,channels=2,samplerate=44100} :duplicate{dst=std{access=http,mux=ogg,");
sb.append("dst=");
sb.append(serverAddress);
sb.append(':');
sb.append(serverPort);
sb.append("/");
sb.append(id);
sb.append("}}");
return sb.toString();
}
对于mux的封装,我们是公司要求用的ogg,当然根据特殊需要,也可以换成其他封装格式的,比如:ts
问题:转流的时候转为h264是最优化的,这种格式压缩比高,性能强,但是个人做这块的时候,我尝试转为h264,在浏览器出不来视频,没看出来是怎么回事。现在采用theo,可以实现目的,但是这种格式流量会费点。
private Boolean isInterrupt = false;
private String url;//摄像头访问地址
private HeadlessMediaPlayer mediaPlayer;
private String suffix;//发布后的最后一级访问路径
private String serverAddress;//发布后的地址(IP)
private int serverPort;//发布后的端口号
public StreamTaskThread(String url, HeadlessMediaPlayer mediaPlayer,String serverAddress, int serverPort, String suffix) {
this.url = url;
this.mediaPlayer = mediaPlayer;
this.serverAddress = serverAddress;
this.serverPort = serverPort;
this.suffix = suffix;
}
@Override
public void run() {
if (!this.isInterrupt) {
System.out.println(url + "开始运行");
try {
//不管摄像头的类型是什么,浏览器的网络协议就是http,所以全部按照http协议转换。
String options = formatHttpStream();
//此处针对不同的协议类型,发布的时候也需要附带不同的参数。
if (url.startsWith("http")) {
mediaPlayer.playMedia(url, options, ":sout-ts-dts-delay=100", ":sout-all", ":sout-keep");
} else if (url.startsWith("rtsp") | url.startsWith("rtp")) {
mediaPlayer.playMedia(url, options, ":no-sout-rtp-sap",
":sout-ts-dts-delay=100",
":no-sout-standard-sap",
":sout-all",
":sout-keep");
}
} catch (Exception e) {
System.out.println(url + "发布失败,从阻塞中退出...");
}
}
}
/**
* The proper way to stop the thread
*/
@Override
public void interrupt() {
this.isInterrupt = true;
mediaPlayer.stop();
try {
super.interrupt();
} catch (Exception e) {
System.out.println("The thread has been interrupted.");
}
}
no-sout-rtp-sap SAP宣告(默认关闭)
sout-ts-dts-delay=100 DTS延迟 (毫秒),延迟在流中与SCR进行比较的DTS(解码时间戳)和PTS(显示时间戳)数据,这将允许某些在客户端解码器中的缓存
no-sout-standard-sap SAP宣告(默认关闭)
sout-all 为所有ES开启流(默认关闭),流式化所有通量流(视频,音频和字幕) (默认关闭)
sout-keep 保持流输出打开(默认关闭)
如果有更优化的,望大神指教。
参考文档:http://cisco.chinaitlab.com/TCP/18644.html
本文深入探讨了音视频直播流媒体技术的核心概念、关键组件及其应用实践,包括流媒体协议、WebRTC直播视频会议、流媒体直播转发服务器、P2P点对点直播和VOIP视频通话等内容。
2286





