2017-12-09 30 views
0

오디오 파일을 html5 오디오 요소 인 각도 응용 프로그램에 스트리밍하려고하고 src를 내 api 끝점 (예 :/audio/234)으로 설정하려고합니다. 내 백엔드는 .NET Core 2.0으로 구현됩니다. 저는 이미 이런 종류의 스트리밍을 구현했습니다 : .NET Core| MVC pass audio file to html5 player. Enable seekingHTML5 오디오 찾기가 제대로 작동하지 않습니다. 응답 내용 길이 길이 불일치 예외

오디오가 재생되기 시작하면 즉시 파일 끝까지 탐색하지 않으면 검색이 작동합니다. 오디오 요소의 autoplay 속성을 사용하여 즉시 오디오 요소에 충분한 데이터가 재생되도록 시작합니다. 그래서 내 상황에서는 오디오 요소가 아직 찾지 못했을 때 모든 데이터를 가지고 있으므로 내 API에 새로운 GET을 만듭니다.

실패 : 내 백엔드 로그에 그 상황에서이 예외가 Microsoft.AspNetCore.Server.Kestrel [13] [1] 연결 ID가 "0HL9V370HAF39"요청 ID "0HL9V370HAF39 : 00000001"처리되지 않은 예외가 응용 프로그램에 의해 throw되었습니다. [1] System.InvalidOperationException : 응답 Content-Length mismatch : 쓸 수있는 바이트 수가 너무 적습니다 (0 개 중 6126919).

여기 내 오디오 컨트롤러 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 Core 1.1에서는이 예외가 발생하지 않았지만이 테스트는 단지 일치 또는 잘못된 테스트 일지 확실하지 않습니다. 그러나 누군가가 정보를 가지고 있다면 스트리밍과 관련된 .NET Core에서 뭔가 바뀌 었습니다. 그 정보를 고맙게 생각합니다.

답변

1

이제 내가 더 연구했을 때 이것을 발견했습니다. https://docs.microsoft.com/en-us/aspnet/core/aspnetcore-2.0 향상된 HTTP 헤더 지원 머리글. 이 내용은 다음과 같습니다.

응용 프로그램 방문자가 범위 요청 헤더로 콘텐츠를 요청하면 ASP.NET은이를 인식하고 해당 헤더를 처리합니다. 요청 된 컨텐트가 부분적으로 전달 될 수 있으면 ASP.NET은 요청 된 바이트 집합을 적절히 건너 뛰고 반환합니다. 이 기능을 조정하거나 처리하기 위해 특수 처리기를 메서드에 작성할 필요가 없습니다. 자동으로 처리됩니다.

.NET 코어 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);