我正在使用带有MPMoviePlayerController的简单iOS测试应用程序的实时流媒体。我在iOS模拟器7.1,XCode 5.1上运行它。我现在没有物理设备可以进行测试。
该流位于本地网络上,但通过WiFi访问。使用VLC生成实时流,如下所示:
vlc -I dummy rtsp://media1.law.harvard.edu/Media/policy_a/2012/02/02_unger.mov vlc://quit --sout='#transcode{vcodec=h264,vb=512,scale=1,acodec=none,venc=x264{preset=ultrafast,aud,profile=baseline,level=30,keyint=5,bframes=0,ref=1},acodec=aac,ab=128}:std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=/tmp/streaming/mystream.m3u8,index-url=http://192.168.254.4/mystream-########.ts},mux=ts{use-key-frames},dst=/tmp/streaming/mystream-########.ts}'
当我开始播放流时,我几乎可以立即听到声音并在屏幕上看到一段被冻结的视频帧;大约十二秒后,视频开始正常播放,之后一切都很好。控制台中没有错误。
我可以看到iOS请求流索引文件,然后在应用加载时请求流文件 - 因此它正在请求文件正常。
我认为这可能与iOS有关,最初在根据可用带宽切换到更高的比特率之前最初使用较低的比特率,正如我在文档中所读到的那样。
如果我将MPMoviePlayerController指向以下苹果测试流,那么它会立即播放,并且在切换到更高的质量/比特率之前,似乎首先使用较低质量的流约12秒: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8
我尝试提供一个包含多个比特率的.m3u8文件,例如苹果示例,但它与冻结帧的行为方式相同但只是在较低比特率下持续12秒,播放低分辨率约2-5秒然后屏幕变为空白一段时间然后切换到高比特率 - 整个时间都可以听到音频。控制台中有播放失误的错误。
是否有人知道冻结视频帧的原因以及如何解决它并让它从一开始就能顺利播放?
答案 0 :(得分:0)
通过使用他们的说明编译最新版本的FFmpeg来解决问题:
https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
由于FFMpeg可以完成HLS支持所需的一切,也可能失去VLC部分。
~/bin/ffmpeg -y -i rtsp://media1.law.harvard.edu/Media/policy_a/2012/02/02_unger.mov -hls_time 10 /tmp/streaming/mystream.m3u8