2

我目前正在使用视频播放器在我的 Flex 移动项目上苦苦挣扎。基本上,问题是我似乎根本无法在 iOS 移动设备上播放或至少看到 .MP4 视频(没有视频、没有声音,播放器视图只是空的)。一旦我用 .FLV 视频替换源,一切都运行良好。

我尝试了两种方法,即使它们在我所理解的情况下使用相同的组件。

  • 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:使用Video、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 是我想用于这个项目的格式。我可能会补充一点,我正在为这些 .MP4 文件使用 H.264 编解码器。

有什么我做错了吗?

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

这是一个移动Flex 4.6项目,在适用于Windows 7 Pro的Flash Builder 4.7上使用AIR 3.9

4

2 回答 2

1

带有 RTMP 的 iOS 设备不支持 H.264 视频,而且我还没有看到它在不使用 HTTP Live Streaming 协议的情况下工作。下面是 NetStream.play 的 ActionScript 参考中的一部分:

AIR 3.0 for iOS 中 H.264 视频的特殊注意事项

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.

于 2014-01-28T16:38:44.740 回答
0

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

于 2014-12-22T09:37:44.440 回答