Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#1: 2013-04-15 20:43:10 ЛС | профиль | цитата
В арсенале имею вот такое безобразие: захват кадра и запись его на диск. После читаю картинку по сети. Но скорость записи в файл каких-то 30-40 кб оставляет желать лучшего. За половину секунды не каждый раз успевает записать файл. Или он просто недоступен для чтения в это время. Может есть какие-то более прогрессивные методы для этой задачи?
code_30830.txt
карма: 0

0
файлы: 1code_30830.txt [1.5KB] [146]
Ответов: 8930
Рейтинг: 823
#2: 2013-04-16 10:14:07 ЛС | профиль | цитата
Neo, в Вашей схеме выставил на таймере 15 мс и измерение времени выдачи каждого кадра: 6-8 кадров проскакивали по ~20 мс, а следующий за 230 мс и вместо ожидаемых равномерных 50 кадров/секунду получались рваные по времени 20кадров
Наверное, Windows выполняя свои задачи вмешивается в работу буфера
карма: 19

0
Ответов: 168
Рейтинг: 7
#3: 2013-04-16 22:34:37 ЛС | профиль | цитата
Леонид прав
система использует системное время по своему усмотрению
и вызывает пользовательские таймера после рассасывания внутрисистемных запросов причем все подряд(если их несколько) никогда раньше и всегда позже
Помочь тут могут 3 вещи

-через inlinecode вызывай TimeBeginPeriod(1) в конце работы таймера
переустанавливая точность определения времени- действует на всю систему!, многие приложения ее сбрасывают/переустанавливают и винда в первую очередь после выполнения точного вызова

- используй точный аудио mmtimer (если не занят), при инициализации укажи точность выполнения вызовов (чем точнее тем более нагружается система) и никогда не ставь 1мс(в точности) оставь системе подышать.

- ну и последний вариант приподними приоритет потока на 1..2 единицы в пределах приоритета процесса вызовом
"fid:=SetThreadPriority(my_handle,my_priority);"
где my_handle наш хендл потока
а my_priority нужный приоритет(0 = THREAD_PRIORITY_NORMAL а 15 = THREAD_PRIORITY_TIME_CRITICAL)


карма: 1

1
Голосовали:Neo
Ответов: 704
Рейтинг: 7
#4: 2013-05-10 19:40:11 ЛС | профиль | цитата
Вернулся к вопросу с вебкой, но теперь шибко досаждает что в штатном примере буфер обмена занят. А он часто нужен. Может можно как-то обойти и захватить картинку? Хочу записать в файл ее, но на изображении она просто выводится, а не заносится как данные. Посмотрите схему, пожалуйста.

code_30975.txt
карма: 0

0
файлы: 1code_30975.txt [4.9KB] [126]
Ответов: 8930
Рейтинг: 823
#5: 2013-05-11 00:58:01 ЛС | профиль | цитата
Neo, камераотрисовывает не в картинке, а на "контроле" по handle, а снять Вы пытаетесь через BitMap, где ничего нет
Чем не устраивает точка doSaveDIB?, сжать и изменить размер можно потом, или на ходу, открывая и изменяя только что записанный кадр.
------------ Дoбавленo в 00.58:
Как-то так:

Add(MainForm,2953706,497,63)
{
Point(Handle)
link(onCreate,10066069:doConnect,[(536,83)(536,104)(473,104)(473,132)])
}
Add(WebCam,10066069,483,126)
{
RefreshRate=200
FileDIB="WebCam.bmp"
FileVideo="WebCam.avi"
Point(doSaveDIB)
link(onConnect,14181287:doTimer,[(542,132)(542,46)(281,46)(281,139)])
link(FileDIB,9986682:Var3,[(489,117)(468,117)(468,180)])
link(WinHandle,2953706:Handle,[])
}
Add(Timer,14181287,294,133)
{
Interval=200
Enable=1
link(onTimer,13594787:doNext,[])
}
Add(Hub,5274150,546,259)
{
OutCount=3
link(onEvent1,135645:doLoadFromStream,[])
link(onEvent2,135645:doLoadFromBitmap,[(578,272)(578,258)])
link(onEvent3,135645:doSave,[(571,279)(571,251)])
}
Add(Resize,1060679,497,259)
{
Width=320
Height=240
Point(Result)
link(onResult,5274150:doEvent1,[])
link(Bitmap,2379187:Bitmap,[])
}
Add(Hub,10355637,385,133)
{
OutCount=3
link(onEvent1,2574374:doString,[(410,139)(410,97)])
link(onEvent2,1239902:doString,[])
link(onEvent3,15333943:doLoad,[(410,153)(410,216)])
}
Add(Hub,16467103,462,210)
{
link(onEvent1,2379187:doLoad,[])
link(onEvent2,1060679:doResize,[(487,223)(487,265)])
}
Add(Counter,13594787,343,133)
{
link(onNext,10355637:doEvent1,[])
}
Add(FormatStr,1239902,420,140)
{
DataCount=1
Mask="C:A_WinGamesHiAsmhiasm_4,04b185WebCamerpic0.bmp"
Point(FString)
link(onFString,10066069:doSaveDIB,[])
}
Add(PictureStream,15333943,420,210)
{
link(onLoad,16467103:doEvent1,[])
link(FileName,9986682:Var2,[])
}
Add(GetDataEx,9986682,420,175)
{
link(Data,1239902:FString,[])
}
Add(Jpeg,135645,595,238)
{
Quality=22
Point(doLoadFromBitmap)
Point(doLoadFromStream)
Point(FileName)
link(FileName,2574374:FString,[(601,187)(461,187)(461,131)(426,131)])
}
Add(Bitmap,2379187,497,210)
{
}
Add(FormatStr,2574374,420,91)
{
DataCount=1
Mask="C:A_WinGamesHiAsmhiasm_4,04b185WebCamer2pic%1.jpg"
Point(FString)
}
Пути свои пропишите
карма: 19

1
Голосовали:Neo
Ответов: 704
Рейтинг: 7
#6: 2013-05-11 02:02:55 ЛС | профиль | цитата
Леонид, вот огромное Вам спасибо! И время эти махинации с файлами занимают не много совсем. Я думал это будет очень долго, потому сразу отбросил этот вариант. Все мучился с этим буфером из штатного примера, не находя другого быстрого пути захвата.
карма: 0

0
Ответов: 8930
Рейтинг: 823
#7: 2013-05-11 09:34:39 ЛС | профиль | цитата
Neo, времени может и немного, но ДИСК-то постоянно дёргается, что не совсем хорошо
карма: 19

0
Ответов: 704
Рейтинг: 7
#8: 2013-05-11 11:10:23 ЛС | профиль | цитата
Леонид, диск C мучается с самого рождения
Если нужно его поберечь, то всегда можно использовать драйвер виртуального диска в памяти - работает шикарно.
карма: 0

0
Ответов: 8930
Рейтинг: 823
#9: 2013-05-11 11:45:27 ЛС | профиль | цитата
Neo, и правда, у меня 8 Гб и загрузить её на 100% не удавалось
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#10: 2013-05-11 14:11:30 ЛС | профиль | цитата
Причесал
code_30978.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_30978.txt [1.6KB] [139]
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)