2012-03-16 3 views
0

asp.netスクリプトを使用して、任意の部分またはセクションからmp4ビデオをストリーミングする際に問題に直面しています。開始からmp4ビデオをストリーミングするときにはスクリプトはうまくいきますが、開始点を選択したい場合はストリーミングできませんでした。 (位置> 0) { fsの場合、私はASP.NETを使用したプログレッシブなMP4ストリーミング

if (filename.EndsWith(".mp4") && filename.Length > 2) 
{ 
    FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read); 
    // Sample logic to calculate approx length based on starting time. 
    if (context.Request.Params["starttime"] != null && context.Request.Params["d"] != null) 
    { 
     double total_duration = Convert.ToDouble(context.Request.Params["d"]); 
     double startduration = Convert.ToDouble(context.Request.Params["starttime"]); 
     double length_sec = (double)fs.Length/total_duration; // total length per second 
     seekpos = (long)(length_sec * startduration); 
    } 
    if (seekpos==0) 
    { 
     position = 0; 
     length = Convert.ToInt32(fs.Length); 
    } 
    else 
    { 
     position = Convert.ToInt32(seekpos); 
     length = Convert.ToInt32(fs.Length - position); 
    } 
    // Add HTTP header stuff: cache, content type and length   
    context.Response.Cache.SetCacheability(HttpCacheability.Public); 
    context.Response.Cache.SetLastModified(DateTime.Now); 
    context.Response.AppendHeader("Content-Type", "video/mp4"); 
    context.Response.AppendHeader("Content-Length", length.ToString()); 
    if (position > 0) 
    { 
     fs.Position = position; 
    } 
    // Read buffer and write stream to the response stream 
    const int buffersize = 16384; 
    byte[] buffer = new byte[buffersize]; 

    int count = fs.Read(buffer, 0, buffersize); 
    while (count > 0) 
    { 
     if (context.Response.IsClientConnected) 
     { 
      context.Response.OutputStream.Write(buffer,0, count); 
      context.Response.Flush(); 
      count = fs.Read(buffer, 0, buffersize); 
     } 
     else 
     { 
      count = -1; 
     } 
    } 
    fs.Close(); 
} 

を使用しています

サンプルスクリプトは、私はそれを削除した場合、ビデオはまだ再生することができ、問題は次の行にあると思いますが、開始 から。位置=位置; } > 0

位置を求める場合は、ストリームは、いずれかが、この中で私を助けることができ、認識することができないため、先の位置を求める追跡するために、ストリーミングFLVに使用されるようなmp4ヘッダーが開始することができます。

よろしくお願いいたします。

+1

FileStreamでの位置の設定はテキストファイルでしか機能しないため、プレーヤー(銀色またはフラッシュ)を考慮する必要があります。非常に小さなチャンスmp4で動作する。 – mslliviu

+0

問題は、例えば、jwplayerのようなフラッシュプレーヤーをクリックすると、開始時間をストリーミングスクリプトに送りますが、ストリーミングスクリプトは、mp4の場合に要求された場所からコンテンツを送ることができません。 http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Internet-Information-Services-IIS7-Version2を実装している間に動作しますが、httpスクリプト。 – irfanmcsd

答えて

0

Content-Lengthをファイル長に設定した後、ファイルの一部のみを送信します。

また、私はあなたがそのようなビデオを分けることができるとは思わない、私はあなたがIフレームの先頭にファイルの位置を設定する必要があると思う、これはどういうわけかmp4ファイルを解析し、あなたが望む時間までフレームを作り、ファイルの位置をそのバイトに設定し、そこからストリーミングを開始します。

関連する問題