2016-09-19 21 views
0

xamlコントロールMediaElementにURLを提供してインターネットからライブビデオストリームを再生したいと思います。ビデオが.mp4の場合はすべて正常に動作します。しかし、ビデオがiphoneで撮影されて.movとして保存された場合、MediaElementのショーは何も表示されず、loadingイベントが発生します。初期MediaElementここ (ダウンロードはあまりにも発射他のイベントを完了した後、5分〜):MediaElementStream.AsRamdomAccessStream()を提供し、その後、手動でダウンロードビデオの場合Xaml MediaElementはインターネットからの.movビデオを再生しません

MediaElement media = new MediaElement(); 
media.MediaFailed += Media_MediaFailed; 
media.PartialMediaFailureDetected += Media_PartialMediaFailureDetected; 
media.MediaOpened += Media_MediaOpened; 
media.DownloadProgressChanged += Media_DownloadProgressChanged; 
media.Loading += Media_Loading; 
media.MediaEnded += Media_MediaEnded; 
media.Source = new Uri(URL); 

HttpClient経由して、ビデオはすぐに再生を開始します。 MediaElementは.mov/quicktime動画のライブストリーミングをサポートしていないようです。本当ですか?

答えて

0

実際の問題は、コンテナの原子の順番になりました。すぐに「MOOV」原子に含まれるメタデータを動画ファイルの再生を開始するために

hereを説明したようにプレイヤーに最も重要です。もし、ムービーファイルのアトムが前述のように順序付けされていれば、すべてが期待どおりに動作しますが、ほとんどのビデオエディタ(ffmpeg、quicktime、フラッシュビデオ)は、(右のように)アトムを間違った順序で生成します。 。

し、提供ソリューション:

唯一の解決策は、それらのファイルを修正し、内部の原子を並べ替えることです。これを行うことができます:

  • FFmpegのqt-faststart.cからいくつかのCコードを使用してOldskool方法。コードは、ファイルの先頭に "moov"アトムを移動し、適切なオフセットを追加することによってすべての "stco"サブアトムポインタを更新します。 iOSのAV FoundationフレームワークとObjective-Cの数行を(AndroidはMOVを読み取ることができないので、あなたはまた、MP4にMOVから変換することができます)を使用して
  • :私はまた、発展途上のよう

    #import <AVFoundation/AVAsset.h> 
    #import <AVFoundation/AVAssetExportSession.h> 
    #import <AVFoundation/AVMediaFormat.h> 
    
    + (void) convertVideoToMP4AndFixMooV: (NSString*)filename toPath:(NSString*)outputPath 
    {  
    
    NSURL *url = [NSURL fileURLWithPath:finename];  
    AVAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
    
    
    AVAssetExportSession *exportSession = [AVAssetExportSession 
                exportSessionWithAsset:avAsset 
                presetName:AVAssetExportPresetPassthrough]; 
    
    exportSession.outputURL = [NSURL fileURLWithPath:outputPath]; 
    exportSession.outputFileType = AVFileTypeAppleM4V; 
    
    
    // This should move the moov atom before the mdat atom, 
    // hence allow playback before the entire file is downloaded 
    exportSession.shouldOptimizeForNetworkUse = YES;  
    
    
    [exportSession exportAsynchronouslyWithCompletionHandler: 
    ^{ 
        if (AVAssetExportSessionStatusCompleted == exportSession.status) {} 
         else if (AVAssetExportSessionStatusFailed == exportSession.status) { 
          NSLog(@"AVAssetExportSessionStatusFailed"); 
         } 
         else 
         { 
          NSLog(@"Export Session Status: %d", exportSession.status); 
         } 
    }]; 
    } 
    

これは私の問題を解決しました。

0

movは、内蔵のMediaElementコントロールではサポートされていません。

movビデオタイプはApple Inc.によってQuickTimeプレーヤー用に独自の形式です。つまり、おそらくネイティブでサポートされることはありません。

サポートされているフォーマットとコーデックの一覧はhere on MSDNです。

編集:MediaElementコントロールが実際にmovを含む直接サポートされていないフォーマットを再生するためにPCにインストールされているコーデックを使用することができそうです。

+0

しかし、私は 'MediaElement'だけでなく、事前にダウンロードされたmov動画でローカルmov動画を再生することができます。唯一の問題はライブストリーミングである。ストリーミングがサポートされていないということですか? – Ilia

+0

ああ、私はそれを逃した。その場合、私は本当に確信していません...'mov 'は' mp4'の周りの圧縮にすぎないので、 'MediaElement'はあなたのPCにインストールされたコーデックを使って再生することができるかもしれませんが、それを再生することはできません。私はまた、携帯電話やXboxで、 'mov 'はファイルからでも全く再生されないと思います、それは本当ですか? –

+0

私はデスクトップクライアントだけを書くので、私は携帯電話でXboxをチェックしませんでしたが、あなたが正しいように見えます。また、私はクロムブラウザでhtml5を介して 'mov 'ビデオを開くことに問題がありますが、この発見は別の質問です。 – Ilia

関連する問題