2017-12-09 63 views
0

をスロー(例。/オーディオ/ 234)。バックエンドは.NET Core 2.0で実装されています。私は、オーディオの再生開始時に、すぐにファイルの末尾に求めていない場合.NET Core| MVC pass audio file to html5 player. Enable seekingHTML5オーディオシークが正しく機能していません。私は私のAPIエンドポイントにHTML5のaudio要素とSRCを設定されている角度のアプリケーションにオーディオファイルをストリーミングしようとしているレスポンスのContent-Length不一致例外

が作品を探す:私はすでにストリーミングのこの種を実装しました。私はオーディオ要素のautoplay属性を使用して、すぐに再生を開始します。オーディオ要素には十分なデータがあります。だから私の状況では、私はそれが私のAPIに新しいGETを作るので、オーディオ要素はまだ私が求める時にすべてのデータがありません。

は失敗:私のバックエンドログにそのような状況では、この例外があるMicrosoft.AspNetCore.Server.Kestrel [13] [1]接続ID "0HL9V370HAF39"、リクエストID "0HL9V370HAF39:00000001":未処理アプリケーションによって例外がスローされました。 [1] System.InvalidOperationException:レスポンスContent-Length mismatch:書き込まれたバイト数が少なすぎます(6126919の0)。

は、ここに私のオーディオコントローラのGETメソッドです。

byte[] audioArray = new byte[0]; 
//Here I load audio file from cloud 
long fSize = audioArray.Length; 
long startbyte = 0; 
long endbyte = fSize - 1; 
int statusCode = 200; 
var rangeRequest = Request.Headers["Range"].ToString(); 
_logger.LogWarning(rangeRequest); 
if (rangeRequest != "") 
{ 
    string[] range = Request.Headers["Range"].ToString().Split(new char[] { '=', '-' }); 
    startbyte = Convert.ToInt64(range[1]); 
    if (range.Length > 2 && range[2] != "") endbyte = Convert.ToInt64(range[2]); 
    if (startbyte != 0 || endbyte != fSize - 1 || range.Length > 2 && range[2] == "") 
    { statusCode = 206; } 
} 

_logger.LogWarning(startbyte.ToString()); 
long desSize = endbyte - startbyte + 1; 
_logger.LogWarning(desSize.ToString()); 
_logger.LogWarning(fSize.ToString()); 
Response.StatusCode = statusCode; 
Response.ContentType = "audio/mp3"; 
Response.Headers.Add("Content-Accept", Response.ContentType); 
Response.Headers.Add("Content-Length", desSize.ToString()); 
Response.Headers.Add("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte, fSize)); 
Response.Headers.Add("Accept-Ranges", "bytes"); 
Response.Headers.Remove("Cache-Control"); 
var stream = new MemoryStream(audioArray, (int)startbyte, (int)desSize); 

return new FileStreamResult(stream, Response.ContentType) 
{ 
    FileDownloadName = track.Name 
}; 

一部のヘッダーがありませんか?

私は、.NETのコア1.1でこの例外を取得していないが、私はそれがちょうど一致および/または悪いテストではよく分かりません。しかし、誰かが情報を持っていれば、ストリーミングに関連した.NET Coreで何か変わってしまいました。私はその情報を感謝します。

答えて

1

は今、私はこれを見つけた:https://docs.microsoft.com/en-us/aspnet/core/aspnetcore-2.0拡張HTTPヘッダのサポート - 見出しを見て。これは言う

アプリケーション訪問者がRange Requestヘッダーでコンテンツを要求した場合、ASP.NETはそれを認識してそのヘッダーを処理します。要求されたコンテンツを部分的に配信できる場合、ASP.NETは要求されたバイトセットを適切にスキップして返します。この機能を調整または処理するために、特別なハンドラをメソッドに記述する必要はありません。自動的に処理されます。

.NET Core 1.1から2.0に移行すると、これらのヘッダーのハンドラが既に存在するため、必要なのはクリーンアップだけです。

byte[] audioArray = new byte[0]; 
//Here I get my MP3 file from cloud 
var stream = new MemoryStream(audioArray); 
return new FileStreamResult(stream, "audio/mp3") 
{ 
    FileDownloadName = track.Name 
}; 
1

問題がヘッダーにありました。私はヘッダーが間違っていたか正確に分かっていないか、ストリームの初期化が間違っていましたが、今は動作しています。私はこれをhttps://stackoverflow.com/a/35920244/8081009と使いました。変更のみ私はこれをAudioStreamResultという名前に変更しました。そして、私はこのように使用しました:

Response.ContentType = "audio/mp3"; 
Response.Headers.Add("Content-Accept", Response.ContentType); 
Response.Headers.Remove("Cache-Control"); 
var stream = new MemoryStream(audioArray); 

return new AudioStreamResult(stream, Response.ContentType) 
{ 
    FileDownloadName = track.Name 
}; 

私はAudioStreamResultにフルストリームを渡していることに注意してください。私はより多くの研究とき

var stream = new MemoryStream(audioArray); 
関連する問題