2014-01-28 147 views
2

我目前在使用视频播放器的Flex移动项目上苦苦挣扎。 基本上,问题是我似乎无法在iOS移动设备上播放或至少看到.MP4视频(没有视频,没有声音,播放器视图只是空的)。只要我用.FLV视频替换视频源,一切都可以正常工作。MP4视频仍然隐藏在手机上Flex应用

我已经尝试了两种方法,即使他们使用了我所了解的下面的相同组件。

  • OSMF:使用VideoElement,MediaPlayer,MediaContainer和MediaPlayerSprite。

    private var media:VideoElement; 
        private var mediaPlayer:MediaPlayer; 
        private var mediaContainer:MediaContainer; 
        private var mediaSprite:MediaPlayerSprite; 
    
    
        protected function onViewCreationComplete(event:FlexEvent):void 
        { 
         media = new VideoElement(new URLResource("http://10.140.1.165/jobs/92/eproofing/in/pages/versions/1/page1/video.mp4")); 
         mediaPlayer = new MediaPlayer(media); 
         mediaContainer = new MediaContainer(); 
         mediaContainer.addMediaElement(media); 
         mediaSprite = new MediaPlayerSprite(mediaPlayer, mediaContainer); 
         mediaSprite.addEventListener(MouseEvent.CLICK, onVideoSpriteClicked, false, 0, true); 
         mediaSprite.mediaPlayer.addEventListener(TimeEvent.CURRENT_TIME_CHANGE, onVideoTimeChanged); 
    
         videoContainer.height = manager.selectedPage.formatHeight; 
         videoContainer.width = manager.selectedPage.formatWidth; 
         videoContainer.addChild(mediaSprite); 
        } 
    
  • 的StageVideo:使用视频,NetConnection和NetStream(StageVideo对象使用其实并没有在下面的代码还没有实现,这将是下一步)

    private var video:Video; 
        private var ns:NetStream; 
        private var nc:NetConnection; 
    
        private var isVideoPlaying:Boolean = false; 
    
    
        protected function onViewCreationComplete(event:FlexEvent):void 
        { 
         video = new Video(); 
         nc = new NetConnection(); 
         nc.connect(null); 
         ns = new NetStream(nc); 
         ns.client = {onMetaData:onMetaData}; 
    
         ns.addEventListener(NetStatusEvent.NET_STATUS, onVideoLoaded); 
         ns.play("http://10.140.1.165/jobs/92/eproofing/in/pages/versions/1/page1/video.mp4"); 
         this.isVideoPlaying = true; 
        } 
    
        private function onVideoLoaded(event:NetStatusEvent):void 
        { 
         video.attachNetStream(ns); 
         videoContainer.addChild(video); 
    
         videoContainer.height = video.height = video.videoHeight; 
         videoContainer.width = video.width = video.videoWidth; 
        } 
    
        private function onMetaData(o:Object):void 
        { 
    
        } 
    

两个给我结果相同:只要我使用.FLV,视频就会出现并且播放正确,只要我加载.MP4视频,我就看不到/听到任何东西 当然,MP4是我想要的格式o用于此项目。我可能会补充说我正在为这些.MP4文件使用H.264编解码器。

有什么我做错了吗?

请注意,只要我使用模拟器,这两种格式都可以使用,只有在我的iPad上部署应用程序时才会发生.MP4问题。

这是移动的Flex 4.6项目,使用AIR 3.9Flash Builder的4.7的Windows 7专业版

回答

1

H.264视频不支持与RTMP iOS设备,以及没有使用HTTP Live Streaming协议,我没有看到它的工作。下面是从NetStream.play的ActionScript参考一节:

在AIR 3.0 H.264视频为iOS

For H.264 video, the iOS APIs for video playback accept only a URL to a file or 
stream. You cannot pass in a buffer of H264 video data to be decoded. Depending 
on your video source, pass the appropriate argument to NetStream.play() as 
follows: 

- For progressive playback: Pass the URL of the file (local or remote). 

- For streaming video: Pass the URL of a playlist in Apple's HTTP Live Streaming 
(HLS) format. This file can be hosted by any server; Flash Media Server 4.5 and 
higher has the advantage of being able to encode streams in HLS format. 

+0

谢谢比尔。我不确定完全理解传递文件URL和视频缓冲区之间的区别,但我肯定需要在这一点上做更多的研究。如果没有其他答案,我会查看是否可以对此项目使用其他编码。 –

+0

你有什么解决方案?我有同样的问题。 – ketan

+0

传递URL的格式相同,只是流式视频需要HLS格式视频(带.m3u8后缀,流内容的播放列表文件)。很难遵循,但示例在https://developer.apple.com/streaming/上,其中一些可播放的流示例位于https://developer.apple.com/streaming/examples/basic-stream.html –

0

这并不容易,但如果你真的想在H264的特别注意事项RTMP在iOS上,您可以添加一个ANE来控制iOS RTMP视频播放应用程序(本机)。有一些小公司为iOS制作RTMP H264视频播放器。