0

我正在开发一个自定义 Roku 频道,我需要使用来自以下直播活动的 livestream.com 视频流:

http://livestream.com/accounts/11222132/events/3665575

使用他们的 json 服务,我已经能够获得一个 m3u8 流。该流在 iOS、Android 和 Fire OS 上运行良好,但我无法在 Roku 上运行。

此代码获取并尝试播放我的流:

Function displayVideo()
    print "Displaying video: "
    p = CreateObject("roMessagePort")
    video = CreateObject("roVideoScreen")
    video.setMessagePort(p)

    'bitrates  = [0]          ' 0 = no dots, adaptive bitrate
    'bitrates  = [348]    ' <500 Kbps = 1 dot
    'bitrates  = [664]    ' <800 Kbps = 2 dots
    'bitrates  = [996]    ' <1.1Mbps  = 3 dots
    'bitrates  = [2048]    ' >=1.1Mbps = 4 dots
    bitrates  = [0]    


    request = CreateObject("roUrlTransfer")
    request.SetUrl("http://livestream.com/api/accounts/11222132/events/3665575/viewing_info")
    jsonString = request.GetToString()
    myJson = ParseJSON(jsonString)
    theurl = myJson.streamInfo.m3u8_url
    urls = [theurl]
    print "the json url is:"
    print urls
    qualities = ["SD"]
    StreamFormat = "hls"
    title = "COACB TV 39"
    srt=""

    videoclip = CreateObject("roAssociativeArray")
    videoclip.StreamBitrates = bitrates
    videoclip.StreamUrls = urls
    videoclip.StreamQualities = qualities
    videoclip.StreamFormat = streamformat
    videoclip.Title = title
    print "srt = ";srt
    if srt <> invalid and srt <> "" then
        videoclip.SubtitleUrl = srt
    end if



    video.SetContent(videoclip)
    video.show()

    lastSavedPos   = 0
    statusInterval = 10 'position must change by more than this number of seconds before saving

    while true
        msg = wait(0, video.GetMessagePort())
        if type(msg) = "roVideoScreenEvent"
            if msg.isScreenClosed() then 'ScreenClosed event
                print "Closing video screen"
                exit while
            else if msg.isPlaybackPosition() then
                nowpos = msg.GetIndex()
                if nowpos > 10000

                end if
                if nowpos > 0
                    if abs(nowpos - lastSavedPos) > statusInterval
                        lastSavedPos = nowpos
                    end if
                end if
            else if msg.isRequestFailed()
                print "play failed: "; msg.GetMessage()
            else
                print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
            endif
        end if
    end while
End Function

在我的控制台中,我收到以下相关消息:

显示视频:

json网址是:

http://api.new.livestream.com/accounts/11222132/events/3665575/broadcasts/92495453.m3u8?dw=100&hdnea=st=1436386598~exp=1436387498~acl=/i/11222132_3665575_bee34040_1@123hmac8 _ =dfacbbb090cc8df9435397d7c38d134be418756b3a00620297948eea35bedae7

srt =

未知事件:11 消息:未指定或无效的轨道路径/url。

播放失败:

关闭视频画面

我得到的错误表明 url 无效,事实上,如果我给它一个“nothing honey”的 url 值,它会给我同样的错误。所以如果我从这个 json 得到的 url 是错误的.. 那么它是怎么错的呢?它适用于我的其他设备...

4

1 回答 1

0

从一系列互联网面包屑中,我从以下网址中找到了答案:

首先,这个人遇到了和我一样的问题:

http://forums.roku.com/viewtopic.php?f=34&t=83773&p=494689&hilit=livestream.com#p494689

他说他在这里找到了解决方案:http: //forums.roku.com/viewtopic.php?f=34&t=66537&p=425668& hilit=akamai

第二个链接对我的问题没有完整的解决方案,但它只缺少我添加到解决方案中的一些东西,我将在下面发布。如果您想将 livestream.com 直播流放到 roku 应用程序中,您需要使用他们的 api 来获取包含 m3u8 流的 json 对象。通常,您可以将此 URL 发送到视频播放器,它会工作,但它需要 2 个不会自动获取的 cookie。在这种情况下,我们必须提取它们,然后将它们重新附加到另一个请求。

'*************************************************************
'** displayLivestream()
'*************************************************************
Function displayLivestream ()
    request = CreateObject("roUrlTransfer")
    request.SetUrl("http://livestream.com/api/accounts/11222132/events/3665575/viewing_info")
    jsonString = request.GetToString()
    myJson = ParseJSON(jsonString)
    theurl = myJson.streamInfo.m3u8_url
   print theurl


   req = CreateObject("roUrlTransfer")
   req.SetPort(CreateObject("roMessagePort"))
   req.SetUrl(theurl)   
   req.EnableCookies()
   req.EnableFreshConnection(true)   
   if (req.AsyncGetToString())
      event = wait(30000, req.GetPort())
      if type(event) = "roUrlEvent"
         if (event.GetResponseCode() <> 200)
            'DisplayDialog("No Live Feed", "Please check back later.")
            print "roUrlEvent"
         endif

         headers = event.GetResponseHeadersArray()
      else if event = invalid
          print "AsyncGetToString timeout"
          req.AsyncCancel()
      else
          print "AsyncGetToString unknown event"
      endif
   endif


   Location = ""
   for each header in headers
      print header
      val = header.LookupCI("Set-Cookie")
      val2 = header.LookupCI("Location")
      if (val <> invalid)
         if (val.Left(5) = "hdntl")
            hdntl = val.Left(Instr(1,val,";")-1)
         endif
         if (val.Left(6) = "_alid_")
            alid = val.Left(Instr(1,val,";")-1)
         endif
      endif
      if (val2 <> invalid)
        Location = val2
      endif
   end for

   port = CreateObject("roMessagePort")
   screen = CreateObject("roVideoScreen")
   screen.SetMessagePort(port)
   screen.EnableCookies()  
   print "hdntl is:" 
   print hdntl
   print "alid is:" alid
   screen.AddHeader("Cookie",hdntl)
   screen.AddHeader("Cookie", alid)
   stream = {
      HDBranded: false
      IsHD: false
      StreamBitrates: [0]
      StreamUrls: [theurl]
      StreamQualities: [0]
      StreamFormat: "hls"
      Live: true
   }

   screen.SetContent(stream)
   screen.Show()
   lastSavedPos   = 0
   statusInterval = 10 'position must change by more than this number of seconds before saving

    while true
        msg = wait(0, screen.GetMessagePort())
        if type(msg) = "roVideoScreenEvent"
            if msg.isScreenClosed() then 'ScreenClosed event
                print "Closing video screen"
                exit while
            else if msg.isPlaybackPosition() then
                nowpos = msg.GetIndex()
                if nowpos > 10000

                end if
                if nowpos > 0
                    if abs(nowpos - lastSavedPos) > statusInterval
                        lastSavedPos = nowpos
                    end if
                end if
            else if msg.isRequestFailed()
                print "play failed: "; msg.GetMessage()
            else
                print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
            endif
        end if
    end while
End Function
于 2015-07-09T01:20:49.117 回答