我试着在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文件,这会引发错误。所以我想播放列表文件有问题吧?
也许你们中的一些人可以看出我在这里做错了什么,或者有一些建议如何找到我的问题?我会很感激的。
发布于 2013-07-29 03:05:56
看起来您的iOS代码很好,是您的服务器端代码导致了问题,主要是关于生成m3u8播放列表,以及您如何承载它引用的ts文件。
不幸的是,我的示例代码有点杂乱无章,就像我一年前写的那样(它是用python编写的),它做的比你要求的要多一点(它实时地将一个视频转换成正确的m3u8/ts ),但是它是经过测试和功能的。
您可以在这里查看代码:https://github.com/DFTi/ScribbeoServer/blob/python/transcode.py
为了您的方便,我会在这里粘贴一些相关的方法,希望它能帮助您:
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
祝好运!
https://stackoverflow.com/questions/8547885
复制相似问题