|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вопрос по голосовому чату
Пишу голосовой чат,работает 1 на 1, но хочу сделать конференсвязь, вопросы такие:
1. Как сделать что бы при конференции звуковой поток приходил всем , 2. Сделал для каждого клинта progressBar ,как узнать от кого именно приходят звуковые данные. если в конференцсвязи будут участвовать 5-10 человек. Пытаюсь пока так, получаю буфер(байтов) звуковых данных размером 4096. Разбиваю поток по 120 байт, в начало каждого пакета добовляю свои данные(4-байта)- 1_байт -начало пакета 2_байт-что за пакет(1-звуковой,2-текстовый) 3_байт - ID клинта кто передал пакет 4_байт - номер пакета(0 до 255) что бы складывать пакеты друг за другом Что у нас получаеться ,полных созданых пакетов получаеться 34, 16 байт остаток ,его сохраняем для передачи следующего буфера . 34X120=4080 байт , а унас 4096, 4096-4080=16 каждый пакет у нас получился 124 байта. При приеме ищем начало пакета проверяем кому относиться пакет и отправляем тому окну кто говорить в конференцсвязи. Вся проблема в том что работает но звук искаженный ,где то с байтами на путал. Может кто знает или подскажет где посмотреть, как можно сделать, что бы каждый поток клиента шел именно в свой Stream . текстовый чат понятно чо можно узнать по нику или еще как, просто если прогрессбар не ставить кадому клинту в конференцсвязи ,не понятно кто говорит ,не определить визуально. Может есть готовые функции для разделения потока и складывания их на клиенте. Спасибо. Последний раз редактировалось tolyan249, 25.03.2015 в 19:02. |
#2
|
||||
|
||||
А ты какой-то кодек используешь?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
Передаю и принимаю пока без сжатия PCM как сжать в MP3 и расжать обратно на лету в реальном времени в PCM я пока не знаю. Если передаю и принимаю без разбивки и добавления своих байтов то принимаеться все нормально. звук чистый. Или надо какойто алгоритм свой пидумывать или готовые есть. Можно конечно не разбивать буфер, тогда надо указывать его длинну, потому что длинна буфера может быть разная, а тут у меня фиксировано по 124 байта не зависимо от длины буфера. это примерно алгоритм MPЕG2 TC потока. когда пакеты приходят ты уже знаешь от кого пришел пакет из чем. Просто нужно правильно функции написать, разложения и сложения буфера.
Математика нужна считать до байта. Как правильно написать пока не знаю, уже месяц бьюсь пока застрял на одном месте. Структура потока В транспортном потоке можно выделить несколько уровней абстракции, иерархическая структура которых напоминает сетевую модель OSI. Например поток, содержащий видео, можно представить следующим образом: Смесь различных программ.Пакетизированный элементарный поток (Packetized elementary stream, PES)Элементарный поток (Elementary stream, ES)Группа изображений (Group of pictures, GOP) — предоставляет случайный доступ к картинкеОтдельное изображение (кадр)Срез (Slice) — часть кадра, выделенная для предотвращения распространения ошибок квантованияМакроблок — в составе от 6 до 12 DCT блоков.Элементарный блок кодирования (DCT блок) размером 8x8 точек Важные элементы транспортного потока Пакет Пакет, базовая единица транспортного потока. заголовок начинается с известного Байта Синхронизации (8 бит) 0x47 (0100 0111). Следующие три битовых флага используются, чтобы указать, как должна быть обработана полезная нагрузка.1. Первый флажок указывает на транспортную ошибку. 2. Второй флажок указывает начало полезной нагрузки (payload_unit_start_indicator). Когда полезная нагрузка Transport Stream пакета содержит данные по PSI, payload_unit_start_indicator имеет значение '1'. Если Transport Stream пакет не содержит данные по PSI, то значение payload_unit_start_indicator будет '0'. Ссылка на разделы 2.4.4.1 и 2.4.4.2 . Это также применяется к приватным потокам с stream_type 5 (ссылка на Таблица 2-29). 3. Третий флажок указывает транспортный приоритетный бит. флажки сопровождаются Идентификатором Пакета (13 бит) PID. Используется, чтобы однозначно определить поток, которому принадлежит пакет (например, пакеты PES, соответствующие ES), сгенерированный мультиплексором. PID позволяет получателю дифференцировать поток, которому принадлежит каждый полученный пакет. Некоторые значения PID предопределены и используются, чтобы указать различные потоки информации контроля. От пакета с неизвестным PID, который не требуется получателю, просто отказываются. Специфическое значение PID 0x1FFF зарезервировано, чтобы указать, что пакет — нулевой пакет (и должен быть проигнорирован получателем). два следующих служебных бита используются процедурами условного доступа к зашифрованной полезной нагрузке некоторых пакетов TS. Два служебных бита поля адаптации, которые могут иметь четыре значения:1. 01 — без поля адаптации (adaptation_field), только полезная нагрузка (payload_data) 2. 10 — только поля адаптации (adaptation_field), без полезной нагрузки (payload_data) 3. 11 — поля адаптации (adaptation_field) и далее следует полезная нагрузка (payload_data) 4. 00 — ЗАРЕЗЕРВИРОВАННЫЙ ISO/IEC для будущего использования Наконец есть Счетчик Непрерывности (4 бита) Остальная часть пакета состоит из полезной информации. Пакеты составляют 188 байт в длине, но среда коммуникации может добавить некоторые байты для устранения ошибок пакета. DVB-ASI использует 204 байта и 208 байтов ATSC как транспортный пакет потока. (DVB t=8 и ATSC t=10 то есть дополнительные байты = 2*t). Передача ATSC добавляет 20 байтов Reed-Solomon передовое устранение ошибок, чтобы создать пакет, который является 208 байтов длиной. 188-байтовый размер пакета был первоначально выбран для совместимости с системами ATM. PID Каждая таблица или элементарный поток в транспортном потоке идентифицируется по 13-битовому PID. Демультиплексор извлекает элементарные потоки из общего транспортного потока, объединяя их в потоки с одинаковыми PID. В большинстве приложений планируется использовать временно́е мультиплексирование, чтобы решать, как часто конкретный PID будет появляться в транспортном потоке. Programs Транспортный поток имеет концепцию программы. Единая программа Program Map Table (PMT), которая имеет уникальный PID, и элементарные потоки, связанные с этой программой и имеющие свои PID-ы, которые перечислены в PMT. Например, транспортный поток, используемый в цифровом телевидении может состоять из трех программ, и нести в себе три телевизионных канала. Предположим, каждый канал состоит из одного видео потока и одного или двух аудио потока, и любые необходимые метаданные. Приемник, желающий декодировать один из каналов использует для декодирования лишь PID-ы нужные для данного канала, которые связаны с его программой. Он может отказаться от содержащихся в ней всех других PID-ов. Program Specific Information (PSI) Специальная информация о программах Program Association Table (PAT), Program Map Table (PMT), Conditional Access Table (CAT), Network Information Table (NIT). В спецификации MPEG-2 формат CAT и NIT не регламентирован. PAT Таблица программ (Program Association Table, PAT) содержит PID-ы всех PMT. Её собственный PID всегда 0x0. PMT Таблица структуры программ (Program Map Table, PMT) содержит PIDы и основные характеристики элементарных потоков конкретной программы — видео, звука, дополнительных данных. Для каждой программы есть свой PMT с собственным PID. Кроме того PMT содержит сообщения EMC системы условного доступа, если в программе присутствуют зашифрованные элементарные потоки. PCR Чтобы декодер мог воспроизводить программы в правильное время, на правильной скорости и с синхронизацией, обычно программы периодически передают Program Clock Reference, или PCR, в одном из потоков программы. Это так же называется основной источник опорной частоты (Master Clock). Временные интервалы в MPEG2 рассчитываются по этой частоте. Для примера, временная метка представления (PTS) соответствует PCR. Первые 33-бита соответствуют опорной частоте в 90 кГц. Расширение последовательности на 9 бит соответствует частоте в 27 МГц. Null packets Некоторые протоколы передачи, такие как в стандартах ATSC и DVB, жестко ограничены требованиями к бит-рейту транспортного потока. Таким образом, чтобы поток данных поддерживал постоянную жестко заданную скорость передачи, Multiplexer должен иметь возможность добавлять в поток дополнительные пакеты. Пакеты с PID 0x1FFF как раз служат для этих целей. Поле полезной нагрузки этих пакетов не содержит какой-либо полезной информации, таким образом ресивер получая такой пакет игнорирует его содержимое. Модификация в транспортном потоке, спецификация случайного доступа к медиа (M2TS) Timecode Транспортный поток был создан для кассет и вещания, поэтому потребовались изменения для использования в медиаустройствах со случайным доступом, таких как новое поколение цифровых камер, записывающих на DVD, Blu-ray, жесткие диски или SSD, карты памяти. Система случайного доступа может хранить пакетные данные в буфере, если устройство хранения не готово (например, пока устройство запускается). Пакеты записываются не по порядку. Специальный трек хранит их 4-байтный код времени (timecode — TC), добавленный в стандартные 188-байтные пакеты. В результате получается 192-байтный пакет. Все это неофициально называется M2TS потоком. Blu-ray Disc Association назвала это «BDAV MPEG-2 transport stream». JVC назвала TOD (возможно, как аббревиатура от «Transport stream on disc») когда использовала его в видекамерах с HDD, таких как GZ-HD7. Транспортный поток M2TS также используется для AVCHD видеофайлов, которые часто имеют расширение MTS. Спасибо. Последний раз редактировалось tolyan249, 26.03.2015 в 04:33. |
#4
|
||||
|
||||
Покопай в сторону кодека speex, это кодек для сжатия речи, может работать даже при значительных потерях данных.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
Пытаюсь пока так, получаю буфер(байтов) звуковых данных размером 4096. Разбиваю поток по 120 байт, в начало каждого пакета добовляю свои данные(4-байта)-
1_байт -начало пакета 2_байт-что за пакет(1-звуковой,2-текстовый) 3_байт - ID клинта кто передал пакет 4_байт - номер пакета(0 до 255) что бы складывать пакеты друг за другом Если этого не делать то звук идет нормальный,Просто я пытаюсь создать потоки без добовления порта в SOCKET . 2_байт-что за пакет(1-звуковой,2-текстовый) Это может быть пакет любой какой захочешь, просто данные,текст,видео,звук,файл. Как одновременно передать файл и звук в реальном времени,без открытия дополнительнго порта в SOCKET? 2_байт-что за пакет(1-звуковой,2-текстовый,3-файл,4-видео,5-данные) ну и так далее.(255-значений можно использовать) 2_байт-что за пакет можно узнать кому относится пакет и складывать эти пакеты куда нужно если это звук значит отправляем в звуковые данные, если текст то отправляем для вывода теста или его обработки,если файл то отправляем данные в файл. можно одновременно отправить 255 потоков(если запихать это еще в отдельный поток(THREAD). и это все работает на одном порту. Ппросто дело в разбиение потока и его складывании. просто гдето ошибься в матиматике. буду искать. Спасибо за помощь пишите на мыло если будут вопросы или на сайте на моем. несколько программ на моем сайте(telecentor.ucoz.ru) |
#6
|
||||
|
||||
Оффтоп:
Цитата:
Сейчас тоже варганю сервер/клиент для скайп-телефонов SkypeMate, с самими аппаратами разобрался, в смысле научился кнопочки-звоночки нажимать-вызывать без драйверов, но осталась проблема передачи ЗП по сетке, вот спасибо вам, подали идею как это можно реализовать, буду пробовать что-то подобное смузицировать, отпишусь, если прокатит Добавлено значительно позже: Всё заработало на нарытой OCX от ведора, может кому тоже нужно Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 09.11.2015 в 19:35. |
#7
|
||||
|
||||
Мне вообще показалось, что этот пользователь какой-то очередной спам-бот, ну и сайт какой-то ниочемный.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#8
|
|||
|
|||
Про сайт, я не любитель создавать сайты ,просто выложил свои программы и все.
Все нашел в чем дело , не правильно считал начало пакета, надо считать с 0 в буфере, а ясчитал с 1. Теперь все работает получаю звук чистый ,и знаю от кого он пришел, и двигаю прогрессбар взависимости от громкости говорящего. Т.Е. Конференцсвязь видать кто говорит, у каждого клиента свой прогрессбар,Вся проблема именно создать конференцию, это потоки приходят на сервер,(видео,звук) и их надо отправить всем подключенным клиентам. Какие компоненты использовать(клиент,сервер) для быстрой работы пока не знаю UDP не хочу. Использую пока ServerSocket и ClientSocket. Спасибо за советы и ответы будем копать дальше. |
#9
|
||||
|
||||
Да что за графоманство?
Под конец что-то совсем несвязные сообщения. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |