Я создаю небольшое веб-приложение, которое построено на ядре ASP.NET. Мое приложение предназначено для потоковой передачи видео с клиентов клиентам через сервис.Поддерживать соединение для потоковой передачи в ASP.NET Core
Я следовал этот пост:
http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/
Я реализовал применение обучающей программы успешно, но это было для потокового видео от сервера к клиентам.
То, что я хочу сделать сейчас:
- Клиенты зарегистрировать услугу для потоковой передачи. (с использованием видео или аудио-тегов)
- Служба получает данные, отправленные клиентом (отправить через POSTMAN)
- Служба передает данные своим зарегистрированным клиентам.
Вот что я реализовал:
(Index.cshtml)
<div>
<video width="480"
height="320"
controls="controls"
autoplay="autoplay">
<source src="/api/video/initiate"
type="video/mp4">
</source>
</video>
</div>
StreamingService
public class StreamingService: IStreamingService
{
public IList<Stream> Connections {get;set;}
public StreamingService()
{
Connections = new List<Stream>();
}
public byte[] AnalyzeStream(Stream stream)
{
long originalPosititon = 0;
if (stream.CanSeek)
{
originalPosititon = stream.Position;
stream.Position = 0;
}
try
{
var readBuffer = new byte[4096];
int bytesReader;
while ((byteRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
{
totalBytesRead += byteRead;
if (totalBytesRead == readBuffer.Length)
{
var nextByte = stream.ReadByte();
if (nextByte != -1)
{
var temp = new byte[readBuffer * 2];
Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
readBuffer = temp;
totalBytesRead++;
}
}
}
var buffer = readBuffer;
if (readBuffer.Length != totalBytesRead)
{
buffer = new byte[totalBytesRead];
Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
}
return buffer;
}
finally
{
if (stream.CanSeek)
stream.Position = originalPosititon;
}
}
}
видеоконтроллер
public class VideoController: Controller
{
private readonly IStreamingService _streamingService;
private readonly IHostingEnvironment _hostingEnvironment;
public VideoController(IStreamingService streamingService, IHostingEnvironment hostingEnvironment)
{
_streamingService = streamingService;
_hostingEnvironment = hostingEnvironment;
}
[HttpGet("initiate")]
public IActionResult Initiate()
{
_streamingService.Connections.Add(Response.Body);
}
[HttpPost("broadcast")]
public async Task<IActionResult> Broadcast()
{
// Retrieve data submitted from POSTMAN.
var data = _streamingService.AnalyzeStream(Request.Body);
foreach (var stream in _streamingService.Connections)
{
try
{
await stream.WriteAsync(data, 0, data.Length);
}
catch (Exception exception)
{
stream.Dispose();
_streamingService.Connections.Remove(stream);
}
}
}
}
Когда я отправляю данные с POSTMAN через api/video/broadcast. Для цикла работает, и я получил исключение, сказал, что поток был удален.
Мой вопрос:
- Как я могу держать поток живой для потоковой передачи?
(поток создан в апи/видео/инициирует сохраняется живым, и когда клиент вызывает API/видео/вещание, все инициирован поток будет обновлять свою дату без избавившись)
Спасибо,
Но поток удаляется, когда я обращаюсь к нему. Могу ли я поддерживать связь между клиентом и сервером с помощью IMemoryCache? – Redplane
Плохо, я должен был сначала спросить вас. Как зарегистрировать IStreamingService? какое время жизни? Переходный режим, область действия или синглтон? –
Я использую IStreamingService как Singleton (services.AddSingeton()) –
Redplane