| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Передача потока данных по сети |
| Автор: Incinerated 1.4.2008, 08:53 | ||||
Есть видео-поток:
можно ли его сразу передавать его кусками через сокеты? если можно то как? Если нельзя, то можно ли сами кадры передавать, т.е. дополним этот код следующим:
Можно ли теперь передавать по сети кадры на другой комп? |
| Автор: korian 1.4.2008, 12:11 |
| а в чем проблема? берем байты по адресу frame и передаем. только лучше, наверно, будет файл кусками передавать, а на той стороне уже декодировать (файл то все-таки сжат - меньше передавать). |
| Автор: Incinerated 1.4.2008, 12:32 | ||
есть 2 вопроса: 1. Как можно по байтово передавать frame. 2. Будет ли проигрыватся на клиентской стороне кусок файла? Ну я буду передавать кусками, он будет принимать, и будет ли он отображать корректно картинку? и вообще сможет ли он открыть файл. Но с файлом мне кажется будет пинг большой, т.к. скорее всего его нужно будет сохранять и переоткрывать функцией AVIStreamOpenFromFile(), а работа с жестким диском всегда медленнее чем с оперативкой, а у меня клиентов может быть хоть 20... Есть ли какие нибудь выходы из этой ситуации? |
| Автор: opjox 1.4.2008, 13:30 |
Вам для этого будет достаточно обычных сокетов. По ним полно подробной информации в инете, поиски почти не займут время, а изучить их просто за 1-2 дня (для решения нужной вам задачи). |
| Автор: Incinerated 1.4.2008, 13:38 | ||
работу с сокетами я знаю. Я не знаю как мне frame привести к нужному виду...Есть предположение - использовать memcpy... |
| Автор: opjox 1.4.2008, 13:55 | ||
С AVI прежде не работал, сейчас немого погуглив наткнулся на http://pmg.org.ru/nehe/nehe35.htm , а в нем на такой код (мои коментарии в /**/):
P.S. в ту статью не вчитывался, возможно выводы мои поспешны, но направление вроде верное |
| Автор: Incinerated 7.4.2008, 13:04 | ||||
AVIStreamRead вроде бы что-то делает, т.е. преобразует в нужный мне формат, чтобы передать... А вот как назад это вопроизвести, пускай даже не по сети, просто на одиночном компьюетер, вот это проблема...Может я чего - то не понимаю или что нибудь не так делаю.
вот теоретически в pdata должна быть видео информация о авишке, т.е. тоже самое что и AviStreamInfo... Насколько я знаю структуру видео файлов, но при попытке преобразовать это в AVISTREAMINFO ничего не происходит, записывается NULL. Вообщем я вообще расстерялся, как это можно сделать:(... |
| Автор: korian 7.4.2008, 18:20 |
судя по параметрам это не так. я так понимаю, на сервере надо вызвать AviStreamInfo, получать от туда данные, передавать эту структуру клиенту после этого вызывать AVIStreamRead и передавать данные клиенту - это поидее кадры. на клиенте CreateEditableStream - создаем новый стрим EditStreamSetInfo - записываем инфу о стриме AVIStreamWrite - записываем кадры. дальше уже показываем этот стрим... |
| Автор: Incinerated 8.4.2008, 14:34 | ||
а на сервере мне что делать?! получается мне всю структуру AVISTREAMINFO разбивать на подполя и передавать каждое поле как число? потому что ка киначе сделать я не знаю... И дальше получается мне нужно вызывать функцию AviStreamRead и результат передавать, так? |
| Автор: korian 8.4.2008, 14:54 |
проще сделать так: AVISTREAMINFO asi; ... send(..., &asi, sizeof(asi)); можно было б уже попробывать а вообще чтобы понять как правильно передавать AVI, надо знать как правильно его отображать и как правильно его редактировать например, если вы из 2-х AVI файлов сможете склеить один новый, который будет показывать: 1-я секунда: первая секунда файла1 2-я секунда: первая секунда файла2 3-я секунда: вторая секунда файла1 ... то имху проблем с передачей у вас не будет, так что есть смысл покопать в эту сторону. |
| Автор: Incinerated 11.4.2008, 21:13 | ||
вообщем не очень все получается. Вот код.
вроде почти как бы получилось, а вроде и ничего, т.к. черный квадрат из буфера никак не пойдет, да и в стрим не записывается почему то, даже если получится pdata воспроизвести, то как записать в стрим не понятно. Может есть какие нибудь идеи? |
| Автор: korian 12.4.2008, 23:57 | ||
вот шо у меня получилось:
но вообще, это как-то тупа наверно. каждый раз открывать/закрывать файл... имху должен быть способ лучше. |
| Автор: Incinerated 13.4.2008, 14:46 | ||||
| вообщем вот что в итоге получилось, но во-первых показывает черный прямоугольник, и во-вторых каждый раз на разном этапе на строчке result = AVIStreamWrite(pv1, z-stru1.samploffset, 1, stru.buffer, stru.bytes, AVIIF_KEYFRAME, NULL, NULL); вылетает красная ошибка. Почему я понять не могу. Вот сервер:
вот клиент
т.е. вроде бы тоже самое, только разбил на сервер и клиент и ни фига не фурычит:(. |
| Автор: korian 13.4.2008, 17:34 | ||
и как вы хотите, чтобы это работало? надо ж данные передавать, а не адреса. |
| Автор: Incinerated 13.4.2008, 21:11 | ||||||||
хм, я не проверял работу в сети, но вообще информация передается таким образом. video_info нормально передалось, все совпадает, я проверял. Был изначально такой вариант: сервер
но т.к. я не знал как клиенту узнать размер, т.е. bytes, я передал в вот это:
и клиент:
в таком варианте все еще намного хуже, он получает примерно кадров 8 и все, клиент не может принять информацию buffer. Просто функция возвращает -1, а сервер все посылает отлично. И черный прямоугольник тоже был. И еще вопрос, если не (char*)&bytes, то как еще еще передам(так как я передавал, все принималось отлично, но это возможно потому что я как бы сам себе присылал, хотя если подумать, чужая программа не должна иметь доступ к адресам другой). |