Как вы сказали «Любая помощь будет признательна» , я подумал, что хотел бы упомянуть, что вы можете просто конвертировать сырой файл YCbCr в PNG, TIFF, JPEG или любой другой файл формата с помощью ImageMagick [ 118], который устанавливается в большинстве дистрибутивов Linux и доступен для macOS и Windows.
Запустите терминал (или командную строку, если под Windows) и преобразуйте YCbCr image.raw
в PNG с помощью:
magick -size 1920x1080 -depth 8 YCbCr:image.raw result.png
Или, скажем, файла CCIR 601 YUV в формате NetPBM PPM
:
magick -size 800x600 -depth 8 YUV:image.raw result.ppm
Проблема, которую Вы имеете, состоит в том, потому что Вы получаете данные UDP в потоке GUI, но хотите обработать данные в другом потоке.
Настоящая проблема состоит в том что Ваша попытка использовать асинхронный компонент блокирующимся способом. Лучшее решение состояло бы в том, чтобы пользоваться реальным блокированием коммуникационная библиотека UDP, такая как синапс. Затем очень легко просто ожидать новых данных для получения в потоке.
Вы могли просто записать:
while not Terminated do
begin
BytesRead := FSocker.RecvBufferEx(@(Buffer[0]), BufferSize, Timeout);
if (BytesRead = 0) then
begin
// continue or exit if the receiving Failed
case FSocket.LastError of
0, WSAETIMEDOUT: Continue;
WSAECONNRESET, WSAENETRESET,
WSAENOTCONN, WSAECONNABORTED,
WSAENETDOWN:
begin
CloseConnection;
Exit;
end;
else
CloseConnection;
Exit;
end;
end;
// process the data in the buffer
end;
Я не являюсь близким с кодом Дельфи, но Вы выполняете механизм активного ожидания, который шлифует Ваш ЦП.
Представление сна или задержки с циклом только скрывает проблему. Я предлагаю использовать лучший метод для получения Ваших сообщений/событий. Много решений существуют, как шаблон наблюдателя-слушателя, или поток ожидает и уведомляет схемы.
1 Вам нужна версия Инди, более новой, чем 9.0.0.18, я думаю. Более старые имеют останавливающие шоу ошибки многопоточного выполнения. Это включает все версии Инди, поставленной с Delphi до версии 7.
2 Смотрят на пример кода о том, как работать с Инди.
Существует ли версия GetMessage, который ожидает (блокирует поток), пока сообщение не прибывает?
Этот проект является очень большим проектом. Так обновление Инди является трудным для меня. Но если Вы уверенный проблема будет из-за старой версии Инди, то я обновлю ее.
Я посмотрел на все демонстрации Инди. Эти демонстрации очень просты. В моем проекте у меня есть очень быстрая передача данных. (Как оперативное устройство звукозаписи)
Я не знаю версии GetMassage. Но это объявило в Windows.pas как это
function GetMessage; external user32 name 'GetMessageA';