|
|
@@ -0,0 +1,445 @@
|
|
|
+package sample
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/aliyun/aliyun-oss-go-sdk/oss"
|
|
|
+)
|
|
|
+
|
|
|
+// CreateLiveChannelSample Samples for create a live-channel
|
|
|
+func CreateLiveChannelSample() {
|
|
|
+ channelName := "create-livechannel"
|
|
|
+ //create bucket
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Case 1 - Create live-channel with Completely configure
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Description: "sample-for-livechannel", //description information, up to 128 bytes
|
|
|
+ Status: "enabled", //enabled or disabled
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ FragDuration: 10, //the length of each ts object (in seconds), in the range [1,100], default: 5
|
|
|
+ FragCount: 4, //the number of ts objects in the m3u8 object, in the range of [1,100], default: 3
|
|
|
+ PlaylistName: "test-get-channel-status.m3u8", //the name of m3u8 object, which must end with ".m3u8" and the length range is [6,128],default: playlist.m3u8
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ result, err := bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ playURL := result.PlayUrls[0]
|
|
|
+ publishURL := result.PublishUrls[0]
|
|
|
+ fmt.Printf("create livechannel:%s with config respones: playURL:%s, publishURL: %s\n", channelName, playURL, publishURL)
|
|
|
+
|
|
|
+ // Case 2 - Create live-channel only specified type of target which is required
|
|
|
+ simpleCfg := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS",
|
|
|
+ },
|
|
|
+ }
|
|
|
+ result, err = bucket.CreateLiveChannel(channelName, simpleCfg)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+ playURL = result.PlayUrls[0]
|
|
|
+ publishURL = result.PublishUrls[0]
|
|
|
+ fmt.Printf("create livechannel:%s with simple config respones: playURL:%s, publishURL: %s\n", channelName, playURL, publishURL)
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("PutObjectSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// PutLiveChannelStatusSample Set the status of the live-channel sample: enabled/disabled
|
|
|
+func PutLiveChannelStatusSample() {
|
|
|
+ channelName := "put-livechannel-status"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Case 1 - Set the status of live-channel to disabled
|
|
|
+ err = bucket.PutLiveChannelStatus(channelName, "disabled")
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Case 2 - Set the status of live-channel to enabled
|
|
|
+ err = bucket.PutLiveChannelStatus(channelName, "enabled")
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("PutLiveChannelStatusSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// PostVodPlayListSample Sample for generate playlist
|
|
|
+func PostVodPlayListSample() {
|
|
|
+ channelName := "post-vod-playlist"
|
|
|
+ playlistName := "playlist.m3u8"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ PlaylistName: "playlist.m3u8",
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ //This stage you can push live stream, and after that you could generator playlist
|
|
|
+
|
|
|
+ endTime := time.Now().Add(-1 * time.Minute)
|
|
|
+ startTime := endTime.Add(-60 * time.Minute)
|
|
|
+ err = bucket.PostVodPlaylist(channelName, playlistName, startTime, endTime)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("PostVodPlayListSampleSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// GetVodPlayListSample Sample for generate playlist and return the content of the playlist
|
|
|
+func GetVodPlayListSample() {
|
|
|
+ channelName := "get-vod-playlist"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ PlaylistName: "playlist.m3u8",
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ //This stage you can push live stream, and after that you could generator playlist
|
|
|
+
|
|
|
+ endTime := time.Now().Add(-1 * time.Minute)
|
|
|
+ startTime := endTime.Add(-60 * time.Minute)
|
|
|
+ body, err := bucket.GetVodPlaylist(channelName, startTime, endTime)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+ defer body.Close()
|
|
|
+
|
|
|
+ data, err := ioutil.ReadAll(body)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+ fmt.Printf("content of playlist is:%v\n", string(data))
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("PostVodPlayListSampleSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// GetLiveChannelStatSample Sample for get the state of live-channel
|
|
|
+func GetLiveChannelStatSample() {
|
|
|
+ channelName := "get-livechannel-stat"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ stat, err := bucket.GetLiveChannelStat(channelName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ status := stat.Status
|
|
|
+ connectedTime := stat.ConnectedTime
|
|
|
+ remoteAddr := stat.RemoteAddr
|
|
|
+
|
|
|
+ audioBW := stat.Audio.Bandwidth
|
|
|
+ audioCodec := stat.Audio.Codec
|
|
|
+ audioSampleRate := stat.Audio.SampleRate
|
|
|
+
|
|
|
+ videoBW := stat.Video.Bandwidth
|
|
|
+ videoFrameRate := stat.Video.FrameRate
|
|
|
+ videoHeight := stat.Video.Height
|
|
|
+ videoWidth := stat.Video.Width
|
|
|
+
|
|
|
+ fmt.Printf("get channel stat:(%v, %v,%v, %v), audio(%v, %v, %v), video(%v, %v, %v, %v)\n", channelName, status, connectedTime, remoteAddr, audioBW, audioCodec, audioSampleRate, videoBW, videoFrameRate, videoHeight, videoWidth)
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("GetLiveChannelStatSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// GetLiveChannelInfoSample Sample for get the configuration infomation of live-channel
|
|
|
+func GetLiveChannelInfoSample() {
|
|
|
+ channelName := "get-livechannel-info"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ info, err := bucket.GetLiveChannelInfo(channelName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ desc := info.Description
|
|
|
+ status := info.Status
|
|
|
+ fragCount := info.Target.FragCount
|
|
|
+ fragDuation := info.Target.FragDuration
|
|
|
+ playlistName := info.Target.PlaylistName
|
|
|
+ targetType := info.Target.Type
|
|
|
+
|
|
|
+ fmt.Printf("get channel stat:(%v,%v, %v), target(%v, %v, %v, %v)\n", channelName, desc, status, fragCount, fragDuation, playlistName, targetType)
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("GetLiveChannelInfoSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// GetLiveChannelHistorySample Sample for get push records of live-channel
|
|
|
+func GetLiveChannelHistorySample() {
|
|
|
+ channelName := "get-livechannel-info"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ //at most return up to lastest 10 push records
|
|
|
+ history, err := bucket.GetLiveChannelHistory(channelName)
|
|
|
+ for _, record := range history.Record {
|
|
|
+ remoteAddr := record.RemoteAddr
|
|
|
+ startTime := record.StartTime
|
|
|
+ endTime := record.EndTime
|
|
|
+ fmt.Printf("get channel:%s history:(%v, %v, %v)\n", channelName, remoteAddr, startTime, endTime)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("GetLiveChannelHistorySample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// ListLiveChannelSample Samples for list live-channels with specified bucket name
|
|
|
+func ListLiveChannelSample() {
|
|
|
+ channelName := "list-livechannel"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Case 1: list all the live-channels
|
|
|
+ marker := ""
|
|
|
+ for {
|
|
|
+ // Set the marker value, the first time is "", the value of NextMarker that returned should as the marker in the next time
|
|
|
+ // At most return up to lastest 100 live-channels if "max-keys" is not specified
|
|
|
+ result, err := bucket.ListLiveChannel(oss.Marker(marker))
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, channel := range result.LiveChannel {
|
|
|
+ fmt.Printf("list livechannel: (%v, %v, %v, %v, %v, %v)\n", channel.Name, channel.Status, channel.Description, channel.LastModified, channel.PlayUrls[0], channel.PublishUrls[0])
|
|
|
+ }
|
|
|
+
|
|
|
+ if result.IsTruncated {
|
|
|
+ marker = result.NextMarker
|
|
|
+ } else {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Case 2: Use the parameter "max-keys" to specify the maximum number of records returned, the value of max-keys cannot exceed 1000
|
|
|
+ // if "max-keys" the default value is 100
|
|
|
+ result, err := bucket.ListLiveChannel(oss.MaxKeys(10))
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+ for _, channel := range result.LiveChannel {
|
|
|
+ fmt.Printf("list livechannel: (%v, %v, %v, %v, %v, %v)\n", channel.Name, channel.Status, channel.Description, channel.LastModified, channel.PlayUrls[0], channel.PublishUrls[0])
|
|
|
+ }
|
|
|
+
|
|
|
+ // Case 3: Only list the live-channels with the value of parameter "prefix" as prefix
|
|
|
+ // max-keys, prefix, maker parameters can be combined
|
|
|
+ result, err = bucket.ListLiveChannel(oss.MaxKeys(10), oss.Prefix("list-"))
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+ for _, channel := range result.LiveChannel {
|
|
|
+ fmt.Printf("list livechannel: (%v, %v, %v, %v, %v, %v)\n", channel.Name, channel.Status, channel.Description, channel.LastModified, channel.PlayUrls[0], channel.PublishUrls[0])
|
|
|
+ }
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("ListLiveChannelSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// DeleteLiveChannelSample Sample for delete live-channel
|
|
|
+func DeleteLiveChannelSample() {
|
|
|
+ channelName := "delete-livechannel"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = bucket.DeleteLiveChannel(channelName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("DeleteLiveChannelSample completed")
|
|
|
+}
|
|
|
+
|
|
|
+// SignRtmpURLSample Sample for generate a RTMP push-stream signature URL for the trusted user to push the RTMP stream to the live channel.
|
|
|
+func SignRtmpURLSample() {
|
|
|
+ channelName := "sign-rtmp-url"
|
|
|
+ playlistName := "playlist.m3u8"
|
|
|
+ bucket, err := GetTestBucket(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ config := oss.LiveChannelConfiguration{
|
|
|
+ Target: oss.LiveChannelTarget{
|
|
|
+ Type: "HLS", //the type of object, only supports HLS, required
|
|
|
+ PlaylistName: "playlist.m3u8",
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ result, err := bucket.CreateLiveChannel(channelName, config)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ playURL := result.PlayUrls[0]
|
|
|
+ publishURL := result.PublishUrls[0]
|
|
|
+ fmt.Printf("livechannel:%s, playURL:%s, publishURL: %s\n", channelName, playURL, publishURL)
|
|
|
+
|
|
|
+ signedRtmpURL, err := bucket.SignRtmpURL(channelName, playlistName, 3600)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+ fmt.Printf("livechannel:%s, sinedRtmpURL: %s\n", channelName, signedRtmpURL)
|
|
|
+
|
|
|
+ err = DeleteTestBucketAndLiveChannel(bucketName)
|
|
|
+ if err != nil {
|
|
|
+ HandleError(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("SignRtmpURLSample completed")
|
|
|
+}
|