首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Http实时流媒体到iphone

Http实时流媒体到iphone
EN

Stack Overflow用户
提问于 2011-12-17 21:00:17
回答 1查看 1.9K关注 0票数 1

我试着在iphone上播放http实时流,看起来我已经查看了每一个例子、错误以及我在互联网和苹果文档中发现的关于http实时流的所有东西,我认为我现在处于死胡同。与大多数示例一样,我使用的是MPMoviePlayer。此外,如果我打开vlc播放器的url,我必须添加我可以看到的流。

我成功地在我的 iPhone上播放了苹果BipBop流,即这里,但不能播放我的流媒体。我想我的url没有显示在m3u8文件中,所以我找到了这个终端命令,并成功地使用了它。

/VLC.app/Contents/MacOS/VLC-intf= rtp://@239.35.86.11:10000‘-sout=#transcode{fps=25,vcodec=h264,venc=x264{aud,profile=baseline,level=30,keyint=30,bframes=0,ref=1,nocabac},acodec=mp3,ab=56,音频同步,去交织}:标准{mux=ts,dst=-,access=file}’纵隔分割器-b http://192.168.1.16/~Jonas/streaming/ -f /users/jonas/sites/流媒体/ -D

现在,我的机器上有一个本地播放列表m3u8文件。正如我所理解的,使用该命令,我下载流,将其划分为较小的ts文件,并生成类似于对这些ts文件的引用的m3u8文件。所以我试着装了这个,但还是没有运气。由于某些原因,我甚至无法在vlc或itunes中打开m3u8文件,这会引发错误。所以我想播放列表文件有问题吧?

也许你们中的一些人可以看出我在这里做错了什么,或者有一些建议如何找到我的问题?我会很感激的。

EN

回答 1

Stack Overflow用户

发布于 2013-07-29 03:05:56

看起来您的iOS代码很好,是您的服务器端代码导致了问题,主要是关于生成m3u8播放列表,以及您如何承载它引用的ts文件。

不幸的是,我的示例代码有点杂乱无章,就像我一年前写的那样(它是用python编写的),它做的比你要求的要多一点(它实时地将一个视频转换成正确的m3u8/ts ),但是它是经过测试和功能的。

您可以在这里查看代码:https://github.com/DFTi/ScribbeoServer/blob/python/transcode.py

为了您的方便,我会在这里粘贴一些相关的方法,希望它能帮助您:

代码语言:javascript
复制
  def start_transcoding(self, videoPath):
    if DISABLE_LIVE_TRANSCODE:
      print "Live transcoding is currently disabled! There is a problem with your configuration."
      return
    print "Initiating transcode for asset at path: "+videoPath
    videoPath = unquote(videoPath)
    video_md5 = md5.new(videoPath).hexdigest()
    if self.sessions.has_key(video_md5): # Session already exists?
      return self.m3u8_bitrates_for(video_md5)
    transcodingSession = TranscodeSession(self, videoPath)
    if transcodingSession.can_be_decoded():  
      self.sessions[transcodingSession.md5] = transcodingSession
      return self.m3u8_bitrates_for(transcodingSession.md5)
    else:
      return "Cannot decode this file."

  def m3u8_segments_for(self, md5_hash, video_bitrate):
    segment = string.Template("#EXTINF:$length,\n$md5hash-$bitrate-$segment.ts\n")
    partCount = math.floor(self.sessions[md5_hash].duration / 10)
    m3u8_segment_file = "#EXTM3U\n#EXT-X-TARGETDURATION:10\n"
    for i in range(0, int(partCount)):
      m3u8_segment_file += segment.substitute(length=10, md5hash=md5_hash, bitrate=video_bitrate, segment=i)
    last_segment_length = math.ceil((self.sessions[md5_hash].duration - (partCount * 10)))
    m3u8_segment_file += segment.substitute(length=last_segment_length, md5hash=md5_hash, bitrate=video_bitrate, segment=i)
    m3u8_segment_file += "#EXT-X-ENDLIST"
    return m3u8_segment_file

  def m3u8_bitrates_for(self, md5_hash):
    m3u8_fudge = string.Template(
      "#EXTM3U\n"
     # "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=384000\n"
     # "$hash-384-segments.m3u8\n"
     # "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=512000\n"
     # "$hash-512-segments.m3u8\n"
      "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=768000\n"
      "$hash-768-segments.m3u8\n"
     # "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1024000\n"
     # "$hash-1024-segments.m3u8\n"
    )
    return m3u8_fudge.substitute(hash=md5_hash)

  def segment_path(self, md5_hash, the_bitrate, segment_number):
    # A segment was requested.
    path = self.sessions[md5_hash].transcode(segment_number, the_bitrate)
    if path:
      return path
    else:
      raise "Segment path not found"

这个项目现在都是开源的,可以在这里找到:https://github.com/DFTi/ScribbeoServer/tree/python

在这里可以找到二进制文件:http://scribbeo.com/server

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8547885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档