直播转码可以解决推流端码率较高或较低而导致播放效果不好等问题。通过阅读本文,您可以快速了解直播转码的使用场景、使用限制、转码功能、模板参数、转码规则和宽度自适应等功能。
使用场景
当推流端码率较高而客户端带宽资源有限会导致视频播放卡顿;当推流端码率较低时会导致视频播放效果不好。使用直播转码服务可以快速帮您解决这些问题。
播放器插件需要实现多码率切换。前端播放器插件设置码率切换,需要同一路推流同时提供多种码率的播流地址。视频直播的实时转码功能为同一路推流同时提供多种码率的播流地址服务。
使用H.264编码进行推流,实时转码成H.265编码直播流进行播放,可以降低带宽。
使用H.265编码进行推流,实时转码成低码率H.265编码的直播流进行播放。
为了解决H.265在浏览器不兼容问题需要实时转码成H.264编码的直播流进行播放。
使用直播转码功能会产生转码费用,按转码标准、分辨率规格及对应总转码时长计费。计费规则详见直播转码费用。
使用限制
根据域名+AppName进行转码模板设置时,同一个模板里转码模板类型不能同时配置标准模板和窄带高清TM模板。
按AppName配置转码模板,推流地址中的 AppName 名称和转码模板对应时,转码模板生效。子播流域名复用主播流域名转码模板,子播流域名配置无效。
直播中心为北京、上海、深圳时,每个域名下最多支持300路转码并发流。其他直播中心每个域名下最多支持50路转码并发流。如果一路高清分辨率直播流输入,同时转码成标清和流畅分辨率进行输出播放,算2路转码流。当达到上限后,转码超限的播放连接会播放原始流。可前往播放域名中基本配置 > 基础信息中了解当前用量以及提升配额。
当提供的直播服务不能满足您当前业务需求时,请联系您的阿里云客户经理或通过阿里云其它渠道咨询。
功能说明
目前转码功能分为通用转码、自定义转码、多码率转码和H5自动转码。
通用转码:可引用系统预设模板,包括转码模板的ID和转码输出分辨率。转码输出的码率都是系统预设置不支持修改。
自定义转码:自定义转码配置支持编码格式、分辨率、码率、帧率、视频GOP、触发转码、转码模板ID的设置。
多码率转码:一个转码模板可以同时包含多个转码配置 ,配置多码率转码后,播放器可根据终端网络带宽环境,自动播放相应码率的直播流,从而提高播放体验。
H5自动转码:用于解决原生浏览器超低延时直播(artc://)不支持视频B帧和AAC编码等问题。
系统预设模板
模板详情>>
标准模板
转码模板 | 画质优先模板ID-H264 | 画质优先模板ID-H265 | 时延优先模板ID-H264 | 时延优先模板ID-H265 | 分辨率 | 码率 |
流畅(横屏) | lld | lld265 | lld-ll | lld265-ll | 宽度自适应,高度:360 | ≤470 |
标清(横屏) | lsd | lsd265 | lsd-ll | lsd265-ll | 宽度自适应,高度:432 | ≤680 |
高清(横屏) | lhd | lhd265 | lhd-ll | lhd265-ll | 宽度自适应,高度:648 | ≤1500 |
超清(横屏) | lud | lud265 | lud-ll | lud265-ll | 宽度自适应,高度:1080 | ≤2500 |
标清(横屏) | lsd540 | lsd265-540 | lsd540-ll | lsd265-540-ll | 宽度自适应,高度:540 | ≤680 |
流畅(竖屏) | lld-v | lld265-v | lld-v-ll | lld265-v-ll | 宽度:360,高度自适应 | ≤470 |
标清(竖屏) | lsd-v | lsd265-v | lsd-v-ll | lsd265-v-ll | 宽度:432,高度自适应 | ≤680 |
高清(竖屏) | lhd-v | lhd265-v | lhd-v-ll | lhd265-v-ll | 宽度:648,高度自适应 | ≤1500 |
超清(竖屏) | lud-v | lud265-v | lud-v-ll | lud265-v-ll | 宽度:1080,高度自适应 | ≤2500 |
标清(竖屏) | lsd540-v | lsd265-540-v | lsd540-v-ll | lsd265-540-v-ll | 宽度:540,高度自适应 | ≤680 |
原画-仅转音频 | oriopus | |||||
原画-仅转音频 | oriaac |
窄带高清模板
转码模板 | 画质优先模板ID-H264 | 画质优先模板ID-H265 | 时延优先模板ID-H264 | 时延优先模板ID-H265 | 分辨率 | 码率 |
流畅(横屏) | ld | ld265 | ld-ll | ld265-ll | 宽度自适应,高度:360 | ≤450 |
标清(横屏) | sd | sd265 | sd-ll | sd265-ll | 宽度自适应,高度:432 | ≤480 |
高清(横屏) | hd | hd265 | hd-ll | hd265-ll | 宽度自适应,高度:648 | ≤1200 |
超清(横屏) | ud | ud265 | ud-ll | ud265-ll | 宽度自适应,高度:1080 | ≤1300 |
标清(横屏) | sd540 | sd265-540 | sd540-ll | sd265-540-ll | 宽度自适应,高度:540 | ≤480 |
流畅(竖屏) | ld-v | ld265-v | ld-v-ll | ld265-v-ll | 宽度:360,高度自适应 | ≤450 |
标清(竖屏) | sd-v | sd265-v | sd-v-ll | sd265-v-ll | 宽度:432,高度自适应 | ≤480 |
高清(竖屏) | hd-v | hd265-v | hd-v-ll | hd265-v-ll | 宽度:648,高度自适应 | ≤1200 |
超清(竖屏) | ud-v | ud265-v | ud-v-ll | ud265-v-ll | 宽度:1080,高度自适应 | ≤1300 |
标清(竖屏) | sd540-v | sd265-540-v | sd540-v-ll | sd265-540-v-ll | 宽度:540,高度自适应 | ≤480 |
转码规则
视频直播默认支持延时转码,系统监测到某一路直播转码流无人观看时,不会执行转码。检测到播放端首次播放观看后启动转码,转码过程中5分钟内检测到无人观看即会停止转码。
每一路转码流仅执行一次转码。
转码不是必须服务,可按需配置。
转码协议目前支持FLV、RTMP、HLS、RTS。
分辨率自适应
转码根据横屏或竖屏采用分辨率自适应的算法。
若是横屏自适应转码,转码后视频将根据模板高度自适应宽度。
若是竖屏自适应转码,转码后视频将根据模板宽度自适应高度。
宽度自适应计算说明如下:
例如将1920*1080视频进行流畅横屏(模板ID:ld)转码,分辨率宽度自适应,高度:360,转码后分辨率为:640*360。
例如将1920*1080视频进行流畅竖屏(模板ID:ld-v)转码,分辨率宽度:360,高度自适应,转码后分辨率为:360*203。
目前只有通用转码和自定义转码支持自适应分辨率。
功能配置
通用转码
视频直播目前可通过两种方式进行通用转码配置:
控制台配置通用转码
- 登录视频直播控制台。
单击功能管理>直播转码,进入直播转码页面。
选择您所需要配置的域名,单击通用转码页签,单击添加,配置转码模板。
转码模板参数及说明如下表所示。
参数
说明
AppName
AppName匹配存在优先级:优先匹配推流地址AppName一样的转码模板。如果不存在则会匹配域名内AppName配置为单个星号(*)的转码模板。
触发转码
开启时:首次拉流时才启动转码。
关闭时:只要有推流就启动转码,与是否有拉流无关。
转码模板类型
提供标准模板和窄带高清™模板。标准模板和窄带高清™模板质量和性能不同,价格也不同。标准模板提供原画-仅转音频转码模板。转码模板类型一次仅能选择一个。
转码模板可以一次选择多个。
在使用转码模板时,模板ID是拼接转码地址的参数,拼接方式可参见生成推流地址和播放地址。模板ID以及其他说明请参见系统预设模板。转码模式分为画质优先、时延优先,时延优先模式下转码流的延时较低。
同一个域名下AppName与模板ID以复合主键的形式存在。
直播加密
开启后可选择配置阿里云视频加密或DRM加密。
说明DRM加密仅支持上海、新加坡直播中心。
阿里云视频加密
阿里云视频加密仅支持输出HLS和FLV格式。
KMS主密钥:KMS密钥的区域需要和域名的直播中心保持一致。如果没有密钥,请先前往KMS服务创建一个密钥, 具体操作请参见购买和启用KMS实例。
换Key周期:取值范围为60~3600内的整数。
更多阿里云视频加密功能使用可参见阿里云视频加密。
DRM加密
开启前,需要先配置DRM密钥。具体操作请参见配置DRM加密。
支持播放协议为HLS下Widevine和Fairplay的DRM加密,其中Fairplay需要在DRM证书管理中上传从Apple获取的证书。具体操作请参见申请Fairplay证书。
完成配置后,单击确定。
API 配置通用转码
// This file is auto-generated, don't edit it. Thanks.
package demo;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.core.http.HttpClient;
import com.aliyun.core.http.HttpMethod;
import com.aliyun.core.http.ProxyOptions;
import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder;
import com.aliyun.sdk.service.live20161101.models.*;
import com.aliyun.sdk.service.live20161101.*;
import com.google.gson.Gson;
import darabonba.core.RequestConfiguration;
import darabonba.core.client.ClientOverrideConfiguration;
import darabonba.core.utils.CommonUtil;
import darabonba.core.TeaPair;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.io.*;
public class AddLiveStreamTranscode {
public static void main(String[] args) throws Exception {
// HttpClient Configuration
/*HttpClient httpClient = new ApacheAsyncHttpClientBuilder()
.connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds
.responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds
.maxConnections(128) // Set the connection pool size
.maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds
// Configure the proxy
.proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001))
.setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>"))
// If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true))
.x509TrustManagers(new X509TrustManager[]{})
.keyManagers(new KeyManager[]{})
.ignoreSSL(false)
.build();*/
// Configure Credentials authentication information, including ak, secret, token
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("<Your RegionId>") // Region ID
//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // Service-level configuration
// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/live
.setEndpointOverride("live.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// Parameter settings for API request
AddLiveStreamTranscodeRequest addLiveStreamTranscodeRequest = AddLiveStreamTranscodeRequest.builder()
.regionId("<Your RegionId>")
.domain("<Your Domain>")
.app("<Your App Name>")
.template("<Your Template>")
.encryptParameters("<Your EncryptParameters>")
// Request-level configuration rewrite, can set Http request parameters, etc.
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
// Asynchronously get the return value of the API request
CompletableFuture<AddLiveStreamTranscodeResponse> response = client.addLiveStreamTranscode(addLiveStreamTranscodeRequest);
// Synchronously get the return value of the API request
AddLiveStreamTranscodeResponse resp = response.get();
System.out.println(new Gson().toJson(resp));
// Asynchronous processing of return values
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // Handling exceptions
System.out.println(throwable.getMessage());
return null;
});*/
// Finally, close the client
client.close();
}
}
以上示例实现了对AppName为<AppName>的直播流进行转码配置,转码参数使用系统预设模板<ld>,关于系统预设模板说明请参见本文档系统预设模板。
setLazy("<true>")表示拉流才会触发转码,如果您需要在推流时就触发转码,可以设置setLazy("false")。
更多API说明请参见AddLiveStreamTranscode。
您可以登录视频直播控制台,选择流管理,在对应的推流记录中点击操作列直播地址查看转码流地址。
直播地址中包含原画(Original)地址和转码流地址。
您可在原播流地址
StreamName
后加_转码模板ID
进行自定义拼接转码流地址,详情可参见生成推流地址和播放地址。
自定义转码
如果通用转码模板不能满足您的要求,您可以使用自定义转码配置,自定义转码配置支持编码格式、分辨率、码率、帧率、视频GOP、触发转码、转码模板ID的设置。
视频直播目前可通过两种方式进行自定义转码配置:
控制台配置自定义转码
- 登录视频直播控制台。
单击功能管理>直播转码,进入直播转码页面。
选择您所需要配置的域名,单击自定义转码页签,单击添加,配置转码模板。
转码模板参数及说明如下表所示。
参数
说明
AppName
AppName匹配存在优先级:优先匹配推流地址AppName一样的转码模板。如果不存在则会匹配域名内AppName配置为单个星号(*)的转码模板。
模板ID
在使用转码模板时,模板ID是拼接转码地址的参数,拼接方式可参见生成推流地址和播放地址。
请勿设置与系统预设模板相同的模板ID。系统预设模板ID说明可参见系统预设模板。
同一个域名下AppName与模板ID以复合主键的形式存在。
转码模板类型
分为标准模板、窄带高清™模板和纯音频转码模板。标准模板和窄带高清™模板质量和性能不同,价格也不同。
纯音频转码模板删除视频只输出音频流。
编码格式
支持H.264和H.265。
推荐模板参数
流畅、标清、超清、高清四种推荐参数,选中不同的档位对应的帧率、码率、分辨率会根据系统默认的值进行填入,可在此基础上进行调整。
分辨率
视频输出的分辨率,单位:像素。可选择固定分辨率或分辨率随源.
分辨率随源:若源流分辨率宽高尺寸小于自适应尺寸宽高,按源流输出。若源流分辨率宽高尺寸大于自适应尺寸宽高,按自适应尺寸输出。可选择不同的自适应方式:
短边自适应
长边自适应
横竖屏自适应
固定分辨率:按指定分辨率输出,不同的分辨率档位对应不同的价格,分辨率档位如下所示:
LD:(640×480)及以下。
SD:(1280×720)及以下。
HD:(1920×1080)及以下。
2K:(2560×1440)及以下。
4K:(3840×2160)及以下。
说明
转码计费根据分辨率档位(LD、SD、HD、2K、4K)决定。分辨率档位与通用模板中标准模板的模板ID(包括lld、lsd、lhd、lud)和窄带高清™模板的模板ID(包括ld、sd、hd、ud)无关,模板ID仅作为业务调用时的标识使用,请勿混淆。
控制台不支持分辨率超过1080P的自定义设置,如果您的场景需要2K、4K规格分辨率,可以提交工单申请。
关于如何提交工单,请参见联系我们。
分辨率档位判定规则:输出规格按输出视频分辨率的长边和短边是否属于输出规格划定的范围进行判定。
以输出SD(1280×720)规格为例:
如果输出视频的分辨率长边小于等于1280且短边小于等于720,则该视频属于该输出规格。
如果输出视频的长边大于1280或输出视频的短边大于720,则该输出视频属于更高的输出规格。
视频帧率
帧率随源:若帧率在限制范围内,按源帧率输出,超过上限按上限输出,低于下限按下限输出
固定帧率:输出指定的视频帧率,单位:FPS。数值低于或等于输入帧率。
视频码率
码率随源:若码率在限制范围内,按源码率输出,超过上限按上限输出,低于下限按下限输出,同时支持按倍率输出。
固定码率:使用指定的码率,单位:kbps。分辨率档位指定的码率如下所示:
LD:100~800。
SD:200~1500。
HD:500~4000。
2K:2000~8000。
4K:4000~30000。
视频GOP
输出视频GOP即Group of picture(图像组),指两个I帧之间的间隔,数值低于或等于输入值。为了保障低延时效果不能大于3秒。
音频码率(纯音频转码)
转码模板类型选择纯音频转码模板时显示。单位:kbps。取值范围:8~1000。
编码档次(纯音频转码)
转码模板类型选择纯音频转码模板时显示。
LC-AAC:低复杂性高级音频编码。转码效率较高。
HE-AAC:高效性高级音频编码。在低音频码率(通常128 kbps以下)时音效要高于LC-AAC。
采样率(纯音频转码)
转码模板类型选择纯音频转码模板时显示音频采样率。取值:22050、32000、44100、48000、96000。
声道数(纯音频转码)
转码模板类型选择纯音频转码模板时显示,声音轨道的个数,取值:1或2。
转码模式(高级配置)
支持画质优先和时延优先,时延优先模式下转码流的延时较低。
触发转码(高级配置)
开启时:首次拉流时才启动转码。
关闭时:只要有推流就启动转码,与是否有拉流无关。
视频加密(高级配置)
开启后可选择配置阿里云视频加密或DRM加密。
说明DRM加密仅支持上海、新加坡直播中心。
阿里云视频加密
阿里云视频加密仅支持输出HLS和FLV格式。
KMS主密钥:KMS密钥的区域需要和域名的直播中心保持一致。如果没有密钥,请先前往KMS服务创建一个密钥, 具体操作请参见购买和启用KMS实例。
换Key周期:取值范围为60~3600内的整数。
更多阿里云视频加密功能使用可参见阿里云视频加密。
DRM加密
开启前,需要先配置DRM密钥。具体操作请参见配置DRM加密。
支持播放协议为HLS下Widevine和Fairplay的DRM加密,其中Fairplay需要在DRM证书管理中上传从Apple获取的证书。具体操作请参见申请Fairplay证书。
透传所有类型SEI(高级配置)
开启后,可透传所有类型SEI,不开启则不透传SEI。
关键帧随源(高级配置)
开启后,转码输出流关键帧与原始流关键帧一致。
pts随源(高级配置)
开启后,转码输出流pts与原始流pts一致。
单击确定添加。
API配置自定义转码
由于自定义转码参数设置较为复杂,我们建议您使用API时结合控制台进行自定义转码配置。
首先,您通过控制台添加一个自定义转码配置。
控制台支持分辨率尺寸效果预览以及快捷填入流畅,标清,高清,超清模板参数。
完成各项参数调整后,通过调用DescribeLiveStreamTranscodeInfoAPI查询转码配置信息。
Java SDK查询转码配置信息示例代码如下:
// This file is auto-generated, don't edit it. Thanks.
package demo;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.core.http.HttpClient;
import com.aliyun.core.http.HttpMethod;
import com.aliyun.core.http.ProxyOptions;
import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder;
import com.aliyun.sdk.service.live20161101.models.*;
import com.aliyun.sdk.service.live20161101.*;
import com.google.gson.Gson;
import darabonba.core.RequestConfiguration;
import darabonba.core.client.ClientOverrideConfiguration;
import darabonba.core.utils.CommonUtil;
import darabonba.core.TeaPair;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.io.*;
public class DescribeLiveStreamTranscodeInfo {
public static void main(String[] args) throws Exception {
// HttpClient Configuration
/*HttpClient httpClient = new ApacheAsyncHttpClientBuilder()
.connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds
.responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds
.maxConnections(128) // Set the connection pool size
.maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds
// Configure the proxy
.proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001))
.setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>"))
// If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true))
.x509TrustManagers(new X509TrustManager[]{})
.keyManagers(new KeyManager[]{})
.ignoreSSL(false)
.build();*/
// Configure Credentials authentication information, including ak, secret, token
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("<Your RegionId>") // Region ID
//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // Service-level configuration
// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/live
.setEndpointOverride("live.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// Parameter settings for API request
DescribeLiveStreamTranscodeInfoRequest describeLiveStreamTranscodeInfoRequest = DescribeLiveStreamTranscodeInfoRequest.builder()
.regionId("<Your RegionId>")
.domainTranscodeName("<Your DomainTranscodeName>")
.appName("<Your AppName>")
// Request-level configuration rewrite, can set Http request parameters, etc.
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
// Asynchronously get the return value of the API request
CompletableFuture<DescribeLiveStreamTranscodeInfoResponse> response = client.describeLiveStreamTranscodeInfo(describeLiveStreamTranscodeInfoRequest);
// Synchronously get the return value of the API request
DescribeLiveStreamTranscodeInfoResponse resp = response.get();
System.out.println(new Gson().toJson(resp));
// Asynchronous processing of return values
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // Handling exceptions
System.out.println(throwable.getMessage());
return null;
});*/
// Finally, close the client
client.close();
}
}
您可以将查询出的自定义转码配置信息在您的业务系统内保存成模板。
返回参数说明请参见DescribeLiveStreamTranscodeInfoAPI。
然后调用AddCustomLiveStreamTranscodeAPI根据域名和AppName添加自定义转码配置信息。
// This file is auto-generated, don't edit it. Thanks.
package demo;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.core.http.HttpClient;
import com.aliyun.core.http.HttpMethod;
import com.aliyun.core.http.ProxyOptions;
import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder;
import com.aliyun.sdk.service.live20161101.models.*;
import com.aliyun.sdk.service.live20161101.*;
import com.google.gson.Gson;
import darabonba.core.RequestConfiguration;
import darabonba.core.client.ClientOverrideConfiguration;
import darabonba.core.utils.CommonUtil;
import darabonba.core.TeaPair;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.io.*;
public class AddCustomLiveStreamTranscode {
public static void main(String[] args) throws Exception {
// HttpClient Configuration
/*HttpClient httpClient = new ApacheAsyncHttpClientBuilder()
.connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds
.responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds
.maxConnections(128) // Set the connection pool size
.maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds
// Configure the proxy
.proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001))
.setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>"))
// If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true))
.x509TrustManagers(new X509TrustManager[]{})
.keyManagers(new KeyManager[]{})
.ignoreSSL(false)
.build();*/
// Configure Credentials authentication information, including ak, secret, token
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("<Your RegionId>") // Region ID
//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // Service-level configuration
// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/live
.setEndpointOverride("live.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// Parameter settings for API request
AddCustomLiveStreamTranscodeRequest addCustomLiveStreamTranscodeRequest = AddCustomLiveStreamTranscodeRequest.builder()
.regionId("<Your RegionId>")
.domain("<Your Domain>")
.app("<Your App>")
.kmsKeyID("<Your KmsKeyID>")
.kmsUID("<Your KmsUID>")
.kmsKeyExpireInterval("<Your KmsKeyExpireInterval>")
.template("<Your Template>")
.templateType("<Your TemplateType>")
// Request-level configuration rewrite, can set Http request parameters, etc.
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
// Asynchronously get the return value of the API request
CompletableFuture<AddCustomLiveStreamTranscodeResponse> response = client.addCustomLiveStreamTranscode(addCustomLiveStreamTranscodeRequest);
// Synchronously get the return value of the API request
AddCustomLiveStreamTranscodeResponse resp = response.get();
System.out.println(new Gson().toJson(resp));
// Asynchronous processing of return values
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // Handling exceptions
System.out.println(throwable.getMessage());
return null;
});*/
// Finally, close the client
client.close();
}
}
转码参数说明请参见AddCustomLiveStreamTranscodeAPI。
其他说明:
重新推流后配置才可生效。
App取值必须与推流地址中的AppName名称一样,转码模板才能生效。取值不超过255字符,支持数字、大小写字母、短划线(-)、下划线(_),不能以短划线(-)、下划线(_)开头。
App也支持取值为星号(*)字符,表示匹配任意字符串(包括空字符串)。
转码模板匹配存在优先级,优先匹配和推流地址中AppName名称相同的转码模板配置,若不存在和推流地址中AppName名称一样的转码模板配置,则会匹配App为星号(*)的转码模板配置。
模板ID与AppName以“复合主键”的形式存在。
您可以登录视频直播控制台,选择流管理,在对应的推流记录中点击操作列直播地址查看转码流地址。
直播地址中包含原画(Original)地址和转码流地址。
您可在原播流地址
StreamName
后加_转码模板ID
进行自定义拼接转码流地址,详情可参见生成推流地址和播放地址。
多码率转码
多码率转码可以在一个转码模板内配置多种转码模式。部分地区网络环境差异较大,网络波动会影响终端的播放体验,因此业务方需要配置多码率来匹配带宽情况。配置多码率转码后,播放器可根据终端网络带宽环境,自动播放相应码率的直播流,从而提高播放体验。
目前多码率转码只能通过视频直播控制台进行配置。
控制台配置多码率转码
- 登录视频直播控制台。
单击功能管理>直播转码,进入直播转码页面。
选择您所需要配置的域名,单击多码率转码页签,单击添加,添加多码率转码模板组。
单击基本信息,编辑多码率转码模板组基本信息。
参数及说明如下表:
参数
说明
AppName
AppName必须与推流地址中的AppName名称对应,转码模板才能生效。同一个域名下AppName与模板组ID以复合主键的形式存在。
模板组ID
转码模板组ID。模板组ID是拼接多码率转码地址的参数,支持数字、大小写字母、短横线,添加不超过10个字符。
封装格式
目前仅支持HLS。
触发转码
目前仅支持推流时触发转码。会产生转码费用,暂不支持播流时触发转码。
时间戳对齐
开启后每个模板的GOP项不可设置,采用源视频的GOP。
单击+添加模板,会添加一条模板信息。
单击添加的模板,可以编辑模板参数。不同模板类型需填写的参数可能不同,参数及说明如下表:
参数
说明
模板ID
转码模板组内单个模板的ID。同一个模板组内的模板ID不能重复。
模板类型
标准模板、窄带高清™模板和纯音频转码模板。
纯音频转码模板删除视频只输出音频流。
编码格式(标准模板)
支持H.264和H.265。
分辨率
视频输出的分辨率,单位:像素。不同的分辨率档位对应不同的价格,分辨率档位如下所示:
LD:(640×480)及以下。
SD:(1280×720)及以下。
HD:(1920×1080)及以下。
2K:(2560×1440)及以下。
4K:(3840×2160)及以下。
说明转码计费根据分辨率档位(LD、SD、HD、2K、4K)决定,与通用模板中标准模板的模板ID(包括lld、lsd、lhd、lud)和窄带高清™模板的模板ID(包括ld、sd、hd、ud)无关,请勿混淆。
分辨率档位判定规则:输出规格按输出视频分辨率的长边和短边是否属于输出规格划定的范围进行判定。
以输出SD(1280×720)规格为例:
如果输出视频的分辨率长边小于等于1280且短边小于等于720,则该视频属于该输出规格。
如果输出视频的长边大于1280或输出视频的短边大于720,则该输出视频属于更高的输出规格。
视频码率
分辨率使用指定的码率,单位:kbps。分辨率档位指定的码率如下所示:
LD:100~800。
SD:200~1500。
HD:500~4000。
2K:2000~8000。
4K:4000~30000。
视频帧率
输出视频帧率,单位:FPS。数值低于或等于输入帧率。
视频GOP
输出视频GOP即Group of picture(图像组),指两个I帧之间的间隔,数值低于或等于输入值。为了保障低延时效果不能大于3秒。
编码格式(纯音频转码)
目前仅支持AAC编码格式。
编码档次(纯音频转码)
LC-AAC:低复杂性高级音频编码。转码效率较高。
HE-AAC:高效性高级音频编码。在低音频码率(通常128 kbps以下)时音效要高于LC-AAC。
码率(纯音频转码)
音频码率,取值范围:8~1000。
声道数(纯音频转码)
声音轨道的个数,取值:1或2。
带宽上限阈值
可支持100Kbps~100Mbps范围内的整数或小数,保留两位小数,建议设置为视频码率的1.2~1.5倍。
配置完成后,单击确定。
目前多码率转码流只能提供HLS转码流地址。
播放多码率转码流,需要增加
aliyunols=on
参数,aliyunols=on
为必填的固定字段。
示例地址如下:
http://<DomainName>/<AppName>/<StreamName>_<转码模板组ID>.m3u8?aliyunols=on&auth_key=1234****
以下示例将向您展示多码率转码在实际业务中的使用:
例如现在添加一个如下图所示的多码率转码配置。
在该模板组中自定义了四个级别的转码配置,不同级别参数值设置可参考本文档系统预设模板。
然后进行推流,使用Web端阿里云播放器进行播放,通过调试可以发现,播放器自动根据终端网络带宽环境,播放了相应码率的转码流。
使用阿里云播放器,请参见播放器SDK。
H5自动转码
超低延时直播RTS是以WebRTC信令交互方式为基础的,原生浏览器WebRTC不支持视频B帧和AAC编码,H5播放自动转码将为您实现自适应的转码保障流畅播放。
在开通超低延时直播时可以开通H5自动转码功能,具体操作请参见步骤五:开通超低延时直播功能。
H5自动转码是在原生浏览器超低延时直播(artc://)下处理视频B帧和AAC编码等问题,如需对视频内容进行转码(如调整码率,帧率,分辨率等)还是需要通过通用转码或自定义转码进行配置。
H5自动转码可以和通用转码或自定义转码功能叠加使用。
当使用H5自动转码时会产生纯音频转码类型的费用,详见直播转码费用。
视频加密
在配置通用转码或自定义转码的过程中,您可能已注意到视频加密相关字段,通过转码配置可以实现阿里云视频加密功能,关于阿里云视频加密功能说明以及实现方式请参见阿里云视频加密。
相关文档
转码配置相关API,请参见直播转码。
使用Java SDK,可参见Java SDK使用说明。