Я работаю над видеомагнитофоном для веб-камеры, и мне было интересно попробовать все, когда дело касается этой темы, но есть эта проблема, которую я не могу решить.C++ VIDEOHDR to Image File в capVideoStreamCallback
Все, что вы могли бы задаться вопросом о том, можно найти здесь https://msdn.microsoft.com/en-us/library/windows/desktop/dd757677%28v=vs.85%29.aspx и здесь https://msdn.microsoft.com/en-us/library/windows/desktop/dd757694%28v=vs.85%29.aspx
Теперь, в этом коде
if (capSetCallbackOnVideoStream(hCapWnd, capVideoStreamCallback))
{
capCaptureSequenceNoFile(hCapWnd); //Capture
}
Я убеждаюсь, что каждый кадр, который получает захвачены отправляется capVideoStreamCallback.
Теперь, что я пытаюсь сделать, это преобразовать кадр в изображение и сохранить его где-то, это может быть бесполезно, но это интересно, и это, безусловно, возможно.
Вот моя функция capVideoStreamCallback (это комментарий):
LRESULT CALLBACK capVideoStreamCallback(HWND hWnd, LPVIDEOHDR lpVHdr)
{
BYTE *Image;
BITMAPINFO * TempBitmapInfo = new BITMAPINFO;
ULONG Size;
// First we need to get the full size of the image
Size = capGetVideoFormat(hWnd, TempBitmapInfo, sizeof(BITMAPINFO)); //header size
Size += lpVHdr->dwBytesUsed; //bytes used
Image = new BYTE[Size];
memcpy(Image, TempBitmapInfo, sizeof(BITMAPINFO)); //copy the header to Image
// lpVHdr is LPVIDEOHER passed into callback function.
memcpy(Image + sizeof(BITMAPINFO), lpVHdr->lpData, lpVHdr->dwBytesUsed); //copy the data to Image
//write the image
ofstream output("image.dib", ios::binary);
for (int i = 0; i < Size; i++)
{
output << (BYTE)Image[i];
}
output.close();
return (LRESULT)TRUE;
}
Таким образом, информация о каждом кадре, который отправляется в capVideoStreamCallback можно найти в lpVHdr, который является структурой (https://msdn.microsoft.com/en-us/library/windows/desktop/dd757688%28v=vs.85%29.aspx) и то, что я m пытается сделать здесь, это взять эту информацию и преобразовать ее в изображение.
Сначала я начинаю с получения полного размера изображения, получая размер заголовка и размер данных, а затем я динамически объявлял массив BYTE под названием «Изображение» и копировал заголовок и данные в изображение с помощью memcpy. Я, наконец, использовал streamstream для записи байтов в файл, и это в значительной степени.
Проблема в том, что все работает отлично, но изображение каким-то образом повреждено, потому что оно невозможно открыть.
Что не так в том, что я делаю? Это кажется логичным, но он не работает. Пожалуйста, поделитесь своими идеями и спасибо за чтение.
I что вы не можете использовать вывод << при записи в двоичный файл, поэтому я заменил его на output.write ((char *) Image, Size), но двоичный файл все еще не открывается/поврежден. Может кто-нибудь дать мне руку здесь? – MarioAda