阿里直播SDK,直播推流地址和播流地址生成
阿新 • • 發佈:2018-12-21
最近,公司要搞螢幕遠端控制,包含了螢幕直播。一開始公司準備自己搭伺服器的,後來 公司java後臺說伺服器轉碼,前端還要外掛的,麻煩之類的。然後就變成了用阿里的SDK 一條龍服務。
不過 我自己在前期調研階段 ,也自己實現了直播推送H.264 到伺服器,伺服器轉發到手機解碼播放。延遲1s左右。這個 在我下一篇部落格哪裡會詳細敘說。
阿里直播SDK推流地址生成
首先 來看一個推流地址樣式 rtmp://liveDomain/appName/streamName?auth_key=time-0-0-0e8a5125be0ced0650f10f0e89a11dfa 記得注意 我加粗的字型,下面上程式碼
/**
* @param appName 控制檯上面的app名稱
* @param streamName 流的名稱
* @param time 十位數的時間戳
* @param key 鑑權key
* @param liveDomain 推流域名
* @return 推流的地址
*/
public static String CreatePushUrl(String appName, String streamName, String time, String key, String liveDomain) {
Objects.requireNonNull(appName);
Objects.requireNonNull(streamName);
Objects.requireNonNull(time);
Objects.requireNonNull(key);
Objects.requireNonNull (liveDomain);
String strpush = "/" + appName + "/" + streamName + "-" + time + "-0-0-" + key;
String pushurl = "rtmp://video-center.alivecdn.com/" + appName + "/" + streamName + "?vhost=" + liveDomain + "&auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strpush);
return pushurl;
}
阿里直播SDK播流地址生成
/**
* @param appName 控制檯上面的app名稱
* @param streamName 流的名稱
* @param time 十位數的時間戳
* @param key 鑑權key
* @param liveDomain 推流域名
* @param templateId 無用 傳入null就行
* @return 播放流的地址 預設是flv 也可以更改此程式碼
*/
public static String GetPlayUrl(String appName, String streamName, String time, String key, String liveDomain, String templateId) {
String strviewrtmp1 = null;
String strviewflv1 = null;
String strviewm3u81 = null;
String rtmpurl1 = null;
String flvurl1 = null;
String m3u8url1 = null;
Objects.requireNonNull(appName);
Objects.requireNonNull(streamName);
Objects.requireNonNull(time);
Objects.requireNonNull(key);
Objects.requireNonNull(liveDomain);
if (templateId == null) {
strviewrtmp1 = "/" + appName + "/" + streamName + "-" + time + "-0-0-" + key;
strviewflv1 = "/" + appName + "/" + streamName + ".flv-" + time + "-0-0-" + key;
strviewm3u81 = "/" + appName + "/" + streamName + ".m3u8-" + time + "-0-0-" + key;
rtmpurl1 = "rtmp://" + liveDomain + "/" + appName + "/" + streamName + "?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewrtmp1);
flvurl1 = "http://" + liveDomain + "/" + appName + "/" + streamName + ".flv?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewflv1);
m3u8url1 = "http://" + liveDomain + "/" + appName + "/" + streamName + ".m3u8?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewm3u81);
} else {
strviewrtmp1 = "/" + appName + "/" + streamName + "_" + templateId + "-" + time + "-0-0-" + key;
strviewflv1 = "/" + appName + "/" + streamName + "_" + templateId + ".flv-" + time + "-0-0-" + key;
strviewm3u81 = "/" + appName + "/" + streamName + "_" + templateId + ".m3u8-" + time + "-0-0-" + key;
rtmpurl1 = "rtmp://" + liveDomain + "/" + appName + "/" + streamName + "_" + templateId + "?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewrtmp1);
flvurl1 = "http://" + liveDomain + "/" + appName + "/" + streamName + "_" + templateId + ".flv?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewflv1);
m3u8url1 = "http://" + liveDomain + "/" + appName + "/" + streamName + "_" + templateId + ".m3u8?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewm3u81);
}
Log.d(">>>>>>>>>>>>>>>>>>", rtmpurl1);
Log.d(">>>>>>>>>>>>>>>>>>", flvurl1);
Log.d(">>>>>>>>>>>>>>>>>>", m3u8url1);
return flvurl1;
}
程式碼很全面 現在 附上完整程式碼。
md5加密演算法 網上覆制來的
public class Md5Utils {
public static String getMD5(String str) {
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 計算md5函式
md.update(str.getBytes());
// digest()最後確定返回md5 hash值,返回值為8為字串。因為md5 hash值是16位的hex值,實際上就是8位的字元
// BigInteger函式則將8位的字串轉換成16位hex值,用字串來表示;得到字串形式的hash值
String md5=new BigInteger(1, md.digest()).toString(16);
//BigInteger會把0省略掉,需補全至32位
return fillMD5(md5);
} catch (Exception e) {
throw new RuntimeException("MD5加密錯誤:"+e.getMessage(),e);
}
}
private static String fillMD5(String md5){
return md5.length()==32?md5:fillMD5("0"+md5);
}
}
阿里直播SDK推流播流工具
/**
* 建立時間 2018/11/12
*
* @author plani
*/
public class PlayAndPushUtils {
/**
* @param appName 控制檯上面的app名稱
* @param streamName 流的名稱
* @param time 十位數的時間戳
* @param key 鑑權key
* @param liveDomain 推流域名
* @return 推流的地址
*/
public static String CreatePushUrl(String appName, String streamName, String time, String key, String liveDomain) {
Objects.requireNonNull(appName);
Objects.requireNonNull(streamName);
Objects.requireNonNull(time);
Objects.requireNonNull(key);
Objects.requireNonNull(liveDomain);
String strpush = "/" + appName + "/" + streamName + "-" + time + "-0-0-" + key;
String pushurl = "rtmp://video-center.alivecdn.com/" + appName + "/" + streamName + "?vhost=" + liveDomain + "&auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strpush);
return pushurl;
}
/**
* @param appName 控制檯上面的app名稱
* @param streamName 流的名稱
* @param time 十位數的時間戳
* @param key 鑑權key
* @param liveDomain 推流域名
* @param templateId 無用 傳入null就行
* @return 播放流的地址 預設是flv 也可以更改此程式碼
*/
public static String GetPlayUrl(String appName, String streamName, String time, String key, String liveDomain, String templateId) {
String strviewrtmp1 = null;
String strviewflv1 = null;
String strviewm3u81 = null;
String rtmpurl1 = null;
String flvurl1 = null;
String m3u8url1 = null;
Objects.requireNonNull(appName);
Objects.requireNonNull(streamName);
Objects.requireNonNull(time);
Objects.requireNonNull(key);
Objects.requireNonNull(liveDomain);
if (templateId == null) {
strviewrtmp1 = "/" + appName + "/" + streamName + "-" + time + "-0-0-" + key;
strviewflv1 = "/" + appName + "/" + streamName + ".flv-" + time + "-0-0-" + key;
strviewm3u81 = "/" + appName + "/" + streamName + ".m3u8-" + time + "-0-0-" + key;
rtmpurl1 = "rtmp://" + liveDomain + "/" + appName + "/" + streamName + "?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewrtmp1);
flvurl1 = "http://" + liveDomain + "/" + appName + "/" + streamName + ".flv?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewflv1);
m3u8url1 = "http://" + liveDomain + "/" + appName + "/" + streamName + ".m3u8?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewm3u81);
} else {
strviewrtmp1 = "/" + appName + "/" + streamName + "_" + templateId + "-" + time + "-0-0-" + key;
strviewflv1 = "/" + appName + "/" + streamName + "_" + templateId + ".flv-" + time + "-0-0-" + key;
strviewm3u81 = "/" + appName + "/" + streamName + "_" + templateId + ".m3u8-" + time + "-0-0-" + key;
rtmpurl1 = "rtmp://" + liveDomain + "/" + appName + "/" + streamName + "_" + templateId + "?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewrtmp1);
flvurl1 = "http://" + liveDomain + "/" + appName + "/" + streamName + "_" + templateId + ".flv?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewflv1);
m3u8url1 = "http://" + liveDomain + "/" + appName + "/" + streamName + "_" + templateId + ".m3u8?auth_key=" + time + "-0-0-" + Md5Utils.getMD5(strviewm3u81);
}
Log.d(">>>>>>>>>>>>>>>>>>", rtmpurl1);
Log.d(">>>>>>>>>>>>>>>>>>", flvurl1);
Log.d(">>>>>>>>>>>>>>>>>>", m3u8url1);
return flvurl1;
}
}