Для личного проекта я пытаюсь прочитать из потока MPEG IP-камеры и выполнить некоторые задачи компьютерного зрения для отдельных кадров, которые я получаю (Используя .NET Core 2.2).
Я выполняю GET
запрос к конечной точке MPEG камеры, и мне возвращается multipart/x-mixed-replace
ответ, который непрерывно передает то, что выглядит как отдельные кадры, в виде изображений JPEG.
То, что у меня возникают проблемы с пониманием, - это правильный способ анализакадры из ответа, состоящего из нескольких частей - как полученные кадры для меня не важны, если есть лучший способ для анализа этого вида потока, я, безусловно, открыт для изменений - поиск / обработка видеодля меня это совершенно новый мир:)
Для справки:
Конечная точка MPEG:
GET http://192.168.0.14/mjpeg.cgi
Пример заголовка ответа:
Content-Type: multipart/x-mixed-replace;boundary=--video boundary--
Пример тела ответа:
Content-length: 41142
Date: 02-02-2019 12:43:19 AM
Content-type: image/jpeg
[payload]
--video boundary--
Content-length: 41220
Date: 02-02-2019 12:43:19 AM
Content-type: image/jpeg
[payload]
--video boundary--
То, что у меня есть до сих пор:
var client = new HttpClient() {
BaseAddress = new Uri(streamUrl)
};
var stream = await client.GetStreamAsync(resource);
using (var streamReader = new StreamReader(stream)) {
while(true) {
await GetFrameStart(streamReader);
var frame = await ReadFrame(streamReader);
// Get byte[] from returned frame above and construct image
};
}
// ---
// Fast forward to the start of the Frame's bytes
static async Task GetFrameStart(StreamReader reader) {
string buffer = null;
while (buffer != string.Empty) {
buffer = await reader.ReadLineAsync();
}
}
// Read entire byte array until the video boundary is met
static async Task<String> ReadFrame(StreamReader reader) {
string result = string.Empty;
string line = null;
while(!isBoundary(line)) {
line = await reader.ReadLineAsync();
if (!isBoundary(line)) result += line;
};
return result;
}
Вышеприведенное, кажется, возвращает мне человека [полезная нагрузка] каждого кадра, однакоесли я при преобразовании строки в байты и записи на диск, изображение не является допустимым JPEG:
var bytes = Encoding.UTF8.GetBytes(frame);
using (var fs = new FileStream("test.jpeg", FileMode.Create, FileAccess.Write)) {
fs.Write(bytes, 0, bytes.Length);
}