RTMP推流上傳
OSS支持使用RTMP協(xié)議推送H264編碼的視頻流和AAC編碼的音頻流到OSS。推送到OSS的音視頻數(shù)據(jù)可用于點播或直播場景。本文介紹如何推送音視頻流到OSS,以及如何播放推送到OSS的音視頻數(shù)據(jù)。
使用限制
只能使用RTMP推流的方式,不支持拉流。
上傳的音視頻數(shù)據(jù)中必須包含視頻流,且視頻流格式為H264。
上傳的音視頻數(shù)據(jù)中可選擇是否包含音頻流。若包含音頻流,則只支持AAC格式的音頻流,其他格式的音頻流會被丟棄。
轉(zhuǎn)儲只支持HLS協(xié)議。
一個LiveChannel同時只能有一個客戶端向其推流。
無地域?qū)傩訠ucket不支持使用RTMP推流上傳。
向OSS推送音視頻數(shù)據(jù)
獲取推流地址。
使用SDK調(diào)用PutLiveChannel接口創(chuàng)建一個LiveChannel,并獲取對應的推流地址。
如果Bucket的權(quán)限控制(ACL)為公共讀寫(public-read-write),可直接使用獲取的推流地址進行推流。
如果Bucket ACL為公共讀(public-read)或者私有(private),則需要進行簽名操作。關(guān)于簽名的具體步驟,請參見簽名版本1。
僅Java SDK、Python SDK支持獲取推流地址。
Java
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.*; import java.util.List; import com.aliyun.oss.common.auth.*; public class Demo { public static void main(String[] args) throws Exception { String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 填寫B(tài)ucket名稱,例如examplebucket。 String bucketName = "examplebucket"; // 填寫LiveChannel名稱。 String liveChannelName = "yourLiveChannelName"; // 創(chuàng)建OSSClient實例。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { CreateLiveChannelRequest request = new CreateLiveChannelRequest(bucketName, liveChannelName, "desc", LiveChannelStatus.Enabled, new LiveChannelTarget()); CreateLiveChannelResult result = ossClient.createLiveChannel(request); // 獲取推流地址。 List<String> publishUrls = result.getPublishUrls(); for (String item : publishUrls) { // 獲取不包含簽名信息的推流地址。 System.out.println(item); // 獲取包含簽名信息的推流地址。 LiveChannelInfo liveChannelInfo = ossClient.getLiveChannelInfo(bucketName, liveChannelName); // expires表示過期時間,單位為Unix時間戳。本示例以設(shè)置過期時間為1小時為例。 long expires = System.currentTimeMillis() / 1000 + 3600; // playlistName表示調(diào)用createLiveChannel接口時傳入的具體名稱。如果未傳入該參數(shù),則默認值為"playlist.m3u8"。您也可以通過調(diào)用getLiveChannelInfo接口獲取該名稱。 String signRtmpUrl = ossClient.generateRtmpUri(bucketName, liveChannelName, liveChannelInfo.getTarget().getPlaylistName(), expires); System.out.println(signRtmpUrl); } // 獲取播放地址。 List<String> playUrls = result.getPlayUrls(); for (String item : playUrls) { System.out.println(item); } } catch (OSSException oe) { oe.printStackTrace(); System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }
返回的推流地址如下:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?Expires=1688542428&OSSAccessKeyId=LTAI********&Signature=VfUgZt5N%2B6Uk4C9QH%2BzrRBTO2I****&playlistName=playlist.m3u8 http://examplebucket.oss-cn-hangzhou.aliyuncs.com/test-channel/playlist.m3u8
Python
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # 填寫B(tài)ucket所在地域?qū)腅ndpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 # 填寫存儲空間名稱,例如examplebucket。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填寫LiveChannel名稱,例如test-channel。 channel_name = "test-channel" channel_cfg = oss2.models.LiveChannelInfo(target = oss2.models.LiveChannelInfoTarget()) channel = bucket.create_live_channel(channel_name, channel_cfg) publish_url = channel.publish_url # 生成RTMP推流的簽名URL,并設(shè)置過期時間為3600秒。 signed_publish_url = bucket.sign_rtmp_url(channel_name, "playlist.m3u8", 3600) # 打印未簽名推流地址。 print('publish_url='+publish_url) # 打印簽名推流地址。 print('signed_publish_url='+signed_publish_url)
返回的推流地址如下:
publish_url=rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel signed_publish_url=rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI********&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ckt0Iv****
使用推流地址向OSS推送音視頻數(shù)據(jù)。
使用ffmpeg進行推流
使用ffmpeg推送本地的視頻文件到OSS,示例如下:
ffmpeg -i 1.flv -c copy -f flv "rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI********&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ckt0Iv***"
使用OBS進行推流
安裝OBS應用程序。
在頂部導航欄,選擇
。在左側(cè)導航欄,單擊推流。
在彈出的對話框,按以下說明配置各項參數(shù)。
參數(shù)
說明
服務
下拉選擇自定義。
服務器
填寫步驟1獲取的不包含簽名推流信息的地址:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live
。串流密鑰
填寫步驟1獲取的簽名推流信息:
test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI**************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck********
。單擊確定。
播放推送到OSS的音視頻數(shù)據(jù)
直播場景
在推流的過程中,可以通過HLS協(xié)議播放正在推送的內(nèi)容。各平臺的播放方法如下:
在Android、iOS等移動平臺,直接在瀏覽器輸入LiveChannel對應的播放地址即可。
Mac OS可以使用safari瀏覽器進行播放。
PC端可以安裝VLC多媒體播放器進行播放。安裝完成后,在VLC media player頁面,選擇
,然后將獲取的播放地址play_url填寫至請輸入網(wǎng)絡(luò)URL文本框。
為了直播流暢,可以設(shè)置較小的FragDuration,例如2s。另外,GOP的大小建議與LiveChannel的FragDuration配置保持一致。OBS的GOP (即keyframe Interval)設(shè)置方法如下:
點播場景
推流過程中,OSS總是以直播流的方式推送或更新M3U8。您需要在推流結(jié)束后,調(diào)用PostVodPlaylist接口組裝一個點播用的m3u8文件,然后使用該文件地址來播放。
對于點播的場景,可以設(shè)置較大的GOP來減少ts文件數(shù),從而降低碼率。