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

本文涉及的产品
.cn 域名,1个 12个月
视频直播,500GB 1个月
简介: 直播推流地址和播放地址本身没有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);
 }

}
相关文章
|
8天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
1月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
65 4
|
27天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
42 1
|
3月前
|
存储 Java API
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
26天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
1月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
45 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1
|
1月前
|
Java API 网络安全
Java 发送邮件示例
本示例展示了如何使用Java编程语言发送电子邮件。通过利用JavaMail API,这段代码实现了从配置SMTP服务器,设置邮件属性,到发送邮件的全过程,为开发者提供了实用的参考。
|
20天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
下一篇
无影云桌面