создание моего собственного потока MJPEG

Хотя у настоящих людей много обязанностей, вы направляетесь к анти-шаблону объекта Бога .

Как уже намекали другие, вы должны выделить эти обязанности в отдельные Репозитории и / или Доменные службы . Например:

SecurityService.Authenticate(credentials, customer)
OrderRepository.GetOrderHistoryFor(Customer)
RefundsService.StartRefundProcess(order)

Будьте конкретны с соглашениями об именах (т. Е. Используйте OrderRepository или OrderService вместо OrderManager )

Вы столкнулись с этой проблемой из-за удобства . то есть удобно рассматривать WebsiteUser как совокупный корень и получать доступ ко всему через него.

Если вы сделаете больший акцент на ясности вместо удобства , это должно помочь разделить эти проблемы. К сожалению, это означает, что члены команды должны знать о новых Сервисах.

Еще один способ думать об этом: точно так же, как сущности не должны выполнять свою собственную постоянство (именно поэтому мы используем репозитории ), ваши WebsiteUser не должен обрабатывать возврат / сегментацию и т. д.

Надеюсь, это поможет!

7
задан Joshua 20 October 2009 в 16:49
поделиться

1 ответ

Что ж, насколько я могу судить, вот ваши проблемы:

  1. StreamWriter - неправильный выбор. Можно использовать обычную функцию записи потока. Это означает, что вы должны записывать данные в массив байтов вместо строки.

  2. Вы конвертируете двоичные данные изображения в String64, браузер не знает об этом, по-прежнему думая, что это 32-битные данные.

  3. Ваш формат кадра jpeg не соответствует верный. Вы также должны добавить Content-Length в заголовок кадра, чтобы приложение, получающее поток, знало, когда прекратить чтение, вместо того, чтобы проверять следующую граничную строку при каждом чтении. Это приведет к ускорению чтения данных примерно в 4-5 раз. И в вашем символе новой строки также есть несоответствие, некоторые из них - «\ r \ n», а некоторые другие - «\ n».

  4. Цикл while - это бесконечный цикл.

Итак, вот решение.

Примечание: могут быть некоторые синтаксические ошибки, но вы, вероятно, уловили общую идею.

private byte[] CreateHeader(int length)
{
    string header = 
        "--" + BOUDARY + "\r\n" +
        "Content-Type:image/jpeg\r\n" +
        "Content-Length:" + length + "\r\n" +
        + "\r\n"; // there are always 2 new line character before the actual data

    // using ascii encoder is fine since there is no international character used in this string.
    return ASCIIEncoding.ASCII.GetBytes(header); 
}

public byte[] CreateFooter()
{
    return ASCIIEncoding.ASCII.GetBytes("\r\n");
}

private void WriteFrame(Stream st, Bitmap image)
{
    // prepare image data
    byte[] imageData = null;

    // this is to make sure memory stream is disposed after using
    using (MemoryStream ms = new MemoryStream())
    {
        image.Save(ms, ImageFormat.Jpeg);

        imageData = ms.ToArray();
    }

    // prepare header
    byte[] header = CreateHeader(imageData.Length);
    // prepare footer
    byte[] footer = CreateFooter();

    // Start writing data
    st.Write(header, 0, header.Length);
    st.Write(imageData, 0, imageData.Length);
    st.Write(footer, 0, footer.Length);
}

private void Render(Stream st)
{
    for (int i = 0; i < imageset.Length; i++)
    {
        var resource = Properties.Resources.ResourceManager.GetObject(imageset[i]) as Bitmap;
        WriteFrame(st, resource);
        Thread.Sleep(500);
    }
}
7
ответ дан 7 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: