|
|
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Возникла проблема, решить которую никак не могу, а точнее не могу понять откуда она происходит! Использую компоненты DSPACK234 В их поставке есть демо пример PlayVideoCap - получение видеопотока с камеры и покадровая обработка с событии OnBuffer. Он работает без проблем. Я несколько видоизменил его, добавив изменение получаемого битмапа. Программа перестает работать с ошибкой "Неверный дескриптор" Ниже привожу фрагмент кода. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Если раскоментировать строку //Image.Picture.Assign(bmp); и закоментировать блок try ... except все работает без проблем Подскажите в чем моя ошибка, которая приводит к тому, что портится дескриптор BmpPreview.Handle. Заранее благодарен. Исходники проекта прилагаю. Если нужен комплект DSPACK тоже могу приложить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2019, 21:22 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
LeoAm, выложи код TSampleGrabber.GetBitmap(); Сдается мне, он не делает копию, а просто юзает буфер в качестве источника. А буфер в DS - сущность временная, ее грохнули и вуаля. Вообще, много лишний действий. Просто создай битмап, эквивалентный грабу, и копируй в него буфер при получении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2019, 21:51 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис, Спасибо за отзыв. Ниже код функции GetBitmap и функции где происходит генерация событии о получении нового буфера от DS. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. Относительно временности буфера - возможно, но как я понимаю функция BufferCB сделана так, что пока обработка внутри неё не пройдёт, новое событие FOnBuffer не сработает. В оригинальном примере внутри обработки я ставил sleep более секунды и это не приводило к краху. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2019, 09:29 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
LeoAm Код: pascal 1. 2. Так я и предполагал, функция просто делает обертку для переданного буфера. Дальше код можно не смотреть - это попытка защита от какой-то очень экзотической кривизны. LeoAmОтносительно временности буфера - возможно, но как я понимаю функция BufferCB сделана так, что пока обработка внутри неё не пройдёт, новое событие FOnBuffer не сработает. Так и есть. Внутри функции буфер валидный, и битмап, соответственно, тоже. А какой он будет в момент отрисовки и прочих операций заранее неизвестно. В твоем случае известно - его уже грохнули, потому приходит пушной зверек. Можно поменять схему на примерно такую: Код: pascal 1. 2. 3. 4. 5. 6. 7. и это как-то будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2019, 12:02 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис, Хотелось бы уточнить, что значит авторфункция просто делает обертку для переданного буфера Как я понимаю CreateDIBSection создаёт в памяти объект и выделяет под него память, в которую собственно и копируется передаваемый в параметре GetBitmap буфер: Код: pascal 1. Относительного временного буфера: Вы имеете в виду необходимость копировать в него исходный буфер от DS и потом уже передача локального буфера в качестве параметра GetBitmap? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 16:18 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
LeoAmКак я понимаю CreateDIBSection создаёт в памяти объект и выделяет под него память Ошибаетесь. Буфер используется тот, что передан на вход, копий не делается. LeoAmОтносительного временного буфера: Вы имеете в виду необходимость копировать в него исходный буфер от DS и потом уже передача локального буфера в качестве параметра GetBitmap? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 17:21 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
LeoAmВы имеете в виду необходимость копировать в него исходный буфер от DS и потом уже передача локального буфера в качестве параметра GetBitmap? Причем GetBitmap не нужно делать каждый раз (см. мой код). Важное уточнение: Для выделения буфера используйте только виндовый менеджер памяти (GlobalAllocPtr(GPTR, size)), иначе на больших изображениях будет черное поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:39 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис, Спасибо за разъяснение. С буфером понятно, а вот что касается авторПричем GetBitmap не нужно делать каждый раз что это значит? Событие SampleGrabberBuffer по сути это очередной кадр, соответственно pBuffer будет содержать всегда разные данные. Почему не нужно каждый раз вызывать GetBitmap? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 21:31 |
|
||
|
Проблема с DSPACK при использовании TSampleGrabber
|
|||
|---|---|---|---|
|
#18+
LeoAm, Присвоение handle для TBitmap - достаточно медленная операция. Там приходится парсить содержимое и т.д. Если один раз уже создали, достаточно просто содержимое буфера обновлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 22:21 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39845109&tid=2039186]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 421ms |

| 0 / 0 |
