2011-12-17 137 views
1

我想播放http直播流到iphone,它看起來像我看過每個例子,錯誤和一切,我可以在互聯網上找到和蘋果關於http實時流的文檔,並且我認爲我現在處於死路一條。我在大多數例子中使用MPMoviePlayer。此外,我必須添加我可以看到流,如果我打開vlc播放器的網址。Http直播流媒體到iphone

我成功地玩了蘋果BipBop流在我的iPhone上是here,但無法播放我的流。我想我的網址顯示不在m3u8文件中,所以我找到了這個終端命令,併成功使用它。

/Applications/VLC.app/Contents/MacOS/VLC --intf = RC RTP://@239.35.86.11:10000 「--sout =#{轉碼FPS = 25,=了vcodec H264 ,venc = x264 {aud,profile = baseline,level = 30,keyint = 30,bframes = 0,ref = 1,nocabac},acodec = mp3,ab = 56,audio-sync,deinterlace}:standard {mux = ts ,dst = - ,access = file}'| mediastreamsegmenter -b http://192.168.1.16/~Jonas/streaming/ -f /用戶/喬納斯/網站/流/ -D

現在我有一個播放列表文件M3U8本地我的機器上。正如我理解的命令我下載流劃分成較小的ts文件,並生成m3u8文件,就像對這些ts文件的引用。所以我試圖加載這個,但仍然沒有運氣。由於某些原因,我甚至無法打開vlc或itunes中的m3u8文件,它會引發錯誤。所以我想這是播放列表文件的錯誤?

也許你們中的一些人可以看到我在這裏做錯了什麼或有一些建議如何找到我的問題?我真的很感激。

+0

嘗試蘋果http流驗證器。 http://developer.apple.com/library/ios/#technotes/tn2235/_index.html – Till 2011-12-17 21:19:21

+0

@Till嘿,我已經嘗試過,但流驗證器沒有給出結果,或者當我給它我的m3u8文件的網址它加載了很多,並寫道無法接收文件或類似的東西,我不明白什麼是錯的。 – Lukas 2011-12-18 10:48:31

+1

仔細檢查M3U8並檢查包含的URL是否實際可到達。 – Till 2011-12-18 11:03:18

回答

0

它看起來像你的iOS代碼很好,它是你的服務器端代碼造成的問題,主要是關於生成M3U8播放列表,可能與你如何託管它參考的TS文件。

不幸的是,我的示例代碼有點嘈雜,因爲我一年前寫過它(它是在python中),它比你要求的要多一點(它實時 - 將視頻轉碼爲正確的m3u8/ts東西),但它被測試和功能。

你可以看看這裏的代碼:​​

我會粘貼這裏的一些相關方法,爲您提供方便;我希望它可以幫助你:

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

祝你好運!