В этом примере показано, как использовать UDP, Отправляют, и UDP Получают Системные объекты, чтобы передать аудиоданные по сети.
Пользовательский дейтаграммный протокол (UDP) является частью комплекта межсетевого протокола (IP). UDP обеспечивает эффективную передачу данных, но не гарантирует надежности, порядка данных или целостности данных. Эти характеристики делают UDP подходящим для передачи потокового аудио и видеоданных, но не для двоичных файлов и аналогичных ситуаций, где потеря данных недопустима. Следующая блок-схема показывает операции, вовлеченные в этот пример:
Можно запустить этот пример полностью в одной системе. Однако, чтобы использовать UDP в сети, лучше запускать пример на двух сетевых компьютерах. Если второму компьютеру установили MATLAB®, можно запустить пример на нем непосредственно. В противном случае используйте MATLAB® Coder™, чтобы сгенерировать независимый исполняемый файл, который может работать на втором компьютере.
Чтобы запуститься, запустите следующий скрипт на своем компьютере. В то время как скрипт запускается, объект UDPSender передает аудио данные о синусоиде к объекту UDPReceiver через localhost порт, 127.0.0.1, и затем выводит сигнал на ваших динамиках. Если у вас есть микрофон, можно изменить значение useMicrophone к 'истинному' для того, чтобы передать живое аудио вместо синусоиды.
Запустив скрипт на одиночном компьютере, скопируйте скрипт во второй компьютер. В обоих скриптах замените IP-адрес, 127.0.0.1, с IP-адресом противоположного компьютера. Когда вы запускаете оба скрипта, объекты UDP передают звуковые сигналы друг другу по сети.
% Initialize several configuration parameters. useMicrophone = false; IP_address = '127.0.0.1'; IP_port = 30000; sampleRate = 44100; nChannels = 1; freq = [100 99]; samplesPerFrame = 512; % Create System objects to send local information to a remote client. if useMicrophone % NOTE: audioDeviceReader requires an Audio Toolbox (TM) license localSource = audioDeviceReader('SampleRate', sampleRate,... 'NumChannels', nChannels); %#ok<UNRCH> else localSource = dsp.SineWave('SampleRate', sampleRate,... 'Frequency', freq(1:nChannels),... 'SamplesPerFrame', samplesPerFrame); end remoteSink = dsp.UDPSender('RemoteIPAddress', IP_address, ... 'RemoteIPPort', IP_port); % Create System objects to listen to data produced by the remote client. remoteSource = dsp.UDPReceiver('LocalIPPort', IP_port,... 'MaximumMessageLength', samplesPerFrame,... 'MessageDataType', 'double'); localSink = audioDeviceWriter('SampleRate', sampleRate);
fiveSeconds = 5*sampleRate; for i=1:(fiveSeconds/samplesPerFrame) % Connect the local source to the remote sink. % In other words, transmit audio data. localData = localSource(); remoteSink( localData(:)); % Connect the remote source to the local sink % In other words, receive audio data. remoteData = remoteSource(); if ~isempty(remoteData) localSink(remoteData); end end
Здесь вы вызываете метод release для системных объектов, чтобы закрыть все открытые файлы и устройства.
release(localSource); release(localSink); release(remoteSource); release(remoteSink);
Если вы не можете передать сигнал по сети, проверяйте следующие элементы:
То, что ваш брандмауэр не блокирует номера портов IP, вы используете. В случае необходимости консультируйтесь со своим системным администратором или документацией по операционной системе.
То, что вы используете свободный номер порта IP. Один не использование другим приложением.
То, что операционная система не ограничивает номер порта привилегированным пользователем. Например, Linux обычно ограничивает порты ниже 1024 для использования пользователем root.
В случае необходимости консультируйтесь со своим системным администратором или операционной системой для получения дополнительной информации.
В этом примере показано, как передать двунаправленное аудио потоком по связи UDP.
Postel, J., Пользовательский Дейтаграммный Протокол, https://tools.ietf.org/html/rfc768