2012-03-23 15 views
1

私はシーク位置からMP4ビデオをストリーミング中に問題に直面しています。開始から適切にストリーミング。ストリームMP4ビデオASP.NETのシーク位置から

最初の問題は、mp4ビデオがjwプレーヤーのFlash Player経由でストリーミングされていることです。ときにタイムバー上のユーザーがクリックビデオの他の部分からMP4ビデオのストリーミングを開始するには、JWプレイヤーは、時間情報とともに例えば

http://[url]/stream/mp4.ashx?file=Madagascar3-trailer-48861c.mp4&start=53.71 

を開始PARAMをお送りしますだからjwplayerからのストリーミングのMP4を模索する時間間隔を送信します。

シークがバイトで開始されるため、次のコードを使用して、およその時間間隔をバイトに変換しています。

double total_duration = Convert.ToDouble(context.Request.Params["d"]); 
double startduration = Convert.ToDouble(context.Request.Params["start"]); 
double length_sec = (double)size/total_duration; // total length per second 
start = (long)(length_sec * startduration); 

は、ここで私が求めて位置例えば53.71

private void ChunkDownload(string fullpath, HttpContext context) 
{ 
    long size, start, end, length, fp = 0; 
    using (StreamReader reader = new StreamReader(fullpath)) 
    { 
     size = reader.BaseStream.Length; 
     start = 0; 
     end = size - 1; 
     length = size; 

     double total_duration = Convert.ToDouble(context.Request.Params["d"]); 
     double startduration = Convert.ToDouble(context.Request.Params["start"]); 
     double length_sec = (double)size/total_duration; // total length per second 
     start = (long)(length_sec * startduration); 

     context.Response.AddHeader("Accept-Ranges", "0-" + size); 
     long anotherStart = start; 
     long anotherEnd = end; 

     // End bytes can not be larger than $end. 
     anotherEnd = (anotherEnd > end) ? end : anotherEnd; 
     // Validate the requested range and return an error if it's not correct. 
     if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size) 
     { 

      context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
      throw new HttpException(416, "Requested Range Not Satisfiable"); 
     } 
     start = anotherStart; 
     end = anotherEnd; 

     length = end - start + 1; // Calculate new content length 
     fp = reader.BaseStream.Seek(start, SeekOrigin.Begin); 
     context.Response.StatusCode = 206; 

    } 
    // Notify the client the byte range we'll be outputting 
    context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
    context.Response.AddHeader("Content-Length", length.ToString()); 

    context.Response.WriteFile(fullpath, fp, length); 
    context.Response.End(); 

} 

からストリーミングを開始するために使用しています完全なサンプルコードです。しかし、それはどちらかのプレイヤーが直接ストリームのURLをチェックするなど、有効なMP4ストリームを認識することができませんでした。

誰でもこの問題を解決するのに役立ちますか?

+0

ファイルのヘッダーを再送信してから位置を要求しなければならないと思います。デコーダは圧縮設定を認識できず、ストリームを処理することができません。ちょうど私の意見。 – ppumkin

答えて

1

有効なコンテンツタイプ定義はありません。 ContentTypeをvideo/mp4に設定してみてください。

UPDATE

コンテンツタイプを定義し、あなたのコードに応じてHTTPステータスコードが206であるされている間、私はあなたがこのページをチェックすることをお勧め:206 Partial Content

+0

関数ChunkDownloadを呼び出す前にすでに追加されています。 – irfanmcsd

+0

ビデオストリームは通常Flash Playerのhtml5とiphoneにありますが、シークの場合はFlash Playerやhtml5の場合のみビデオを認識できませんでした。 – irfanmcsd

0

ムハンマド、

私はあなたがやっている気づきますコンテンツヘッダの多くの計算と操作。おそらく、あなたがそれらの数学をすべて行うと、小数点以下の桁数(無効にする)やそれらの設定に関するその他の問題のために有効でないヘッダーが生成されます。など、それが正常に働いている間、ヘッダーを表示するツールを使用

  1. ラン同じプレイヤーを使用して、サイトからのストリーミングでサンプルビデオ:

    意味では、私はあなたが次の操作を行い示唆しています。比較するためのベースラインのセットのヘッダーと有効な値の形式を持つだけです。

  2. は、アプリケーションを実行して、あなたがそれらを設定した後にヘッダを追跡し、おそらくそうのように:さらに良いhow to dump response headers in ASP.Net 、インストール「ライブHTTPヘッダー」Firefoxはプラグインまたはそれらの線に沿って何か。

あなたのヘッダーの作業セットを比較してください。あなたが設定している値に何か奇妙なことがありますか?コンテンツの範囲/長さなどが可能ですか?何とかオフセットされているか無効ですか?ちょうど一貫性を見て、小さな間違いは簡単に要求全体を破ることができます。

多分私はここで何かを見逃していますが、私はそれがいくつかのアイデアを発することを願っています。

0

私はあなたがそのようなmp4ファイルを探すことはできないと思います。 ヘッダーがあっても、動画を再生できるようにIフレームに移動する必要があります。これに間違ったAPIを使用している可能性が非常に高いです。

+0

私は上記の例と直接の方法でios(ipad、iphone)をターゲットとするヘッダなしで可能なすべての方法を試しました。 mp4ビデオストリームが正常に表示されますが、jwプレーヤーやその他のフラッシュプレーヤーをクリックすると、開始位置からビデオのeigherシークや強制的に失敗します。私はちょうどmp4形式の代わりにフラッシュのFLV形式を使用する場合は、情報のために私は適切なシークを得た。ちょうど私は既に働いていた誰かが、同じ問題に直面し、ここで私を助けてくれる助けが必要です。それは私がこのコンポーネントを使用する場合は解決することができますhttp://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Internet-Information-Services-IIS7-Version2 – irfanmcsd

+0

しかし、私は自分のストリーミングハンドラを使用したい任意の第三者コンポーネントの代わりに。 – irfanmcsd

2

合意したように、mp4/m3u8のようなファイルを探してみることはできません。

私はあなたのiPhone開発者や外部コンサルタントが私のiPhone開発チームに試行錯誤のために解決策や回避策を見つけられないと思っています。

2

Googleでは、関連するAPIは見つかりませんでした。

この問題を解決できない場合は、回避策を確認してください。

可能であれば、さらなる調査のための詳細情報を提供してください。

0

私はこの投稿のレスポンスにはコメントしませんが、あなたが間違いなく持っている問題はMP4の解析です。 MP3とは異なり、時間オフセットをこのようなバイト範囲に簡単に変換することはできません。 mp4のmoov要素を解析し、関連するトラックの適切なチャンクを興味のある時間オフセットに基づいて検索する必要があります。moov-> trak-> mdia-> minf-> stbl-> stts sttsボックスは、必要なサンプルから時間へのマッピングを提供します。

関連する問題