视频直播生成推流地址和播放地址的程序示例(Java)

简介: 直播推流地址和播放地址本身没有API接口,需要在客户端自行拼接地址,然后使用推流工具或者播放器对其推流或播放。本文主要介绍如何生成直播的推流以及播放地址(Java示例代码)
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.lang3.*;
public class Create_Live_Url {
 
 /**
  * 计算md5
  * @param param
  * @return
  */
 public static String md5(String param) {
  if(param == null || param.length() == 0) {
   return null;
  }
  try {
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   md5.update(param.getBytes());
   byte[] byteArray = md5.digest();
   
   BigInteger bigInt = new BigInteger(1, byteArray);
                 // 参数16表示16进制
   String result = bigInt.toString(16);
                 // 不足32位高位补零
   while(result.length() < 32) {
    result = "0" + result;
   }
   return result;
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return null;
 }
/**
     * 生成推流地址
     * @param pushDomain 推流域名
     * @param pushKey 推流域名配置的鉴权Key
     * @param appName 推流AppName
     * @param streamName 推流StreamName
     * @param expireTime 过期时间(单位是秒)
     */
 public static void generate_push_url(String pushDomain,String pushKey,String appName,String streamName,long expireTime) {
  String pushUrl = "";
  //推流域名未开启鉴权功能的情况下
  if(pushKey=="") {
   pushUrl = "rtmp://"+pushDomain+"/"+appName+"/"+streamName;
  }else {
   long timeStamp = System.currentTimeMillis()/1000L + expireTime;
   String stringToMd5 = "/"+appName+"/"+streamName+"-"+Long.toString(timeStamp)+"-0-0-"+pushKey;
   String authKey = md5(stringToMd5);
   pushUrl = "rtmp://"+pushDomain+"/"+appName+"/"+streamName+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+authKey;
  }
  System.out.println("推流地址是: "+pushUrl);
 }
/**
  * 生成播放地址
  * @param pullDomain 播放域名
  * @param pullKey 播放鉴权Key
  * @param appName 播放appName(同推流appName)
  * @param streamName 播放streamName (同推流streamName)
  * @param expireTime 过期时间(单位是秒
  */
 public static void general_pull_url(String pullDomain,String pullKey,String appName,String streamName,long expireTime) {
  String rtmpUrl = ""; //rtmp的拉流地址
  String hlsUrl = "";  //m3u8的拉流地址
  String flvUrl = "";  //flv的拉流地址
  //播放域名未配置鉴权Key的情况下
  if(pullKey == "") {
   rtmpUrl = "rtmp://"+pullDomain+"/"+appName+"/"+streamName;
   hlsUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".m3u8";
   flvUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".flv";
  }else {
   long timeStamp = System.currentTimeMillis()/1000L + expireTime;
   String rtmpToMd5 = "/"+appName+"/"+streamName+"-"+Long.toString(timeStamp)+"-0-0-"+pullKey;
   String rtmpAuthKey = md5(rtmpToMd5);
   rtmpUrl = "rtmp://"+pullDomain+"/"+appName+"/"+streamName+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+rtmpAuthKey;
   
   String hlsToMd5 = "/"+appName+"/"+streamName+".m3u8-"+Long.toString(timeStamp)+"-0-0-"+pullKey;
   String hlsAuthKey = md5(hlsToMd5);
   hlsUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".m3u8"+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+hlsAuthKey;
   
   String flvToMd5 = "/"+appName+"/"+streamName+".flv-"+Long.toString(timeStamp)+"-0-0-"+pullKey;
   String flvAuthKey = md5(flvToMd5);
   flvUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".flv"+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+flvAuthKey;
  }
  System.out.println("RTMP播放地址为: "+rtmpUrl);
  System.out.println("m3u8播放地址为: "+hlsUrl);
  System.out.println("flv播放地址为: "+flvUrl);
 }
public static void main(String[] args) {
  // TODO Auto-generated method stub
  //生成长度为5的随机字符串作为appName和streamName(字母和数字组合)
  String appName = RandomStringUtils.randomAlphanumeric(5);;
  String streamName = RandomStringUtils.randomAlphanumeric(5);;
  
  long expireTime = 3600L;
  String pullDomain = "mxl-pull.pier39.cn";
  String pullKey = "querty1234";
    
     String pushDomain = "mxl-push.pier39.cn";
  String pushKey = "querty123";
  Create_Live_Url.general_pull_url(pullDomain, pullKey, appName, streamName, expireTime);
  Create_Live_Url.generate_push_url(pushDomain, pushKey, appName, streamName, expireTime);
 }

}
相关文章
|
2月前
|
Java 开发工具
【GDAL-java的四个常用代码示例】
【GDAL-java的四个常用代码示例】
39 0
|
3月前
|
Java Maven
java修改当前项目的maven仓库地址为国内
修改当前项目的maven仓库地址为国内
|
3月前
|
Java
Java集合操作示例
Java集合操作示例
36 0
|
4月前
|
Java
请解释Java中的异常处理机制,并给出使用try-catch块的示例。
请解释Java中的异常处理机制,并给出使用try-catch块的示例。
|
2月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
24 2
|
13天前
|
Java
简单的 Java 计算器示例
【5月更文挑战第1天】这是一个Java计算器程序,接收用户输入的两个数字和一个运算符(+,-,*,/),通过`Scanner`获取输入,使用`switch`进行计算。当运算符为除法时,检查除数是否为0,防止除零错误。最后,它打印出计算结果。
19 0
|
15天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
|
17天前
|
Java
Java 事件驱动编程:概念、优势与实战示例
【4月更文挑战第27天】事件驱动编程是一种编程范式,其中程序的执行流程由外部事件的发生而触发或驱动。
21 0
|
17天前
|
Java 程序员
Java 异步编程:概念、优势与实战示例
【4月更文挑战第27天】在现代软件开发中,异步编程是一种重要的编程范式,特别适用于处理长时间运行的任务,如网络通信、文件操作等。
21 0
|
17天前
|
Java 数据处理 API
Java 函数式编程:概念、优势与实战示例
【4月更文挑战第27天】函数式编程(Functional Programming,简称 FP)是一种编程范式,它将计算视为数学函数的求值并避免使用程序状态以及可变数据。
22 1