Страница 29 из 36
Re: Ардуино - запись звука
Добавлено: Чт дек 22, 2022 13:57:02
olegue
понятно, но постичь, то,что через gprs нельзя передать 8битный звук - это было выше моих сил.
Добавлено after 4 minutes 58 seconds:
https://aliexpress.ru/item/32341839317. ... 1636476435
закажу вот эту штуку -адаптер LAN под Nano, надо таки довести дело до конца
Добавлено after 3 minutes 23 seconds:
непонятно только как это повлияет на проект с gprs передачей
Re: Ардуино - запись звука
Добавлено: Чт дек 22, 2022 18:23:30
roman.com
ты что-то делаешь неправильно... я пока не знаю что... но знаю что что-то неправильно))
я такой заказывал...
https://aliexpress.ru/item/32832354059. ... 4aa6aAlR4K
он более новый))
Добавлено after 2 hours 53 minutes 42 seconds:
я все модули уже переделал на POE (5V, 2А)... чтоб с проводами не возиться))
на 80 метров по витухе работает.
дальше не проверял)) думаю и 200 метров будет нормально.
Добавлено after 1 minute 39 seconds:
надо будет потом тоже добавить звук... например для домофона))
только звук без шифрования по интернету передавать нельзя... а по локалке пойдёт))
Добавлено after 8 minutes 34 seconds:
щас застрял с приёмником...
sn74hc00 медленно работают))
надо другие...

Re: Ардуино - запись звука
Добавлено: Пт дек 30, 2022 18:28:48
olegue
roman.com, можно ли Ваш ява плейер скомпилировать под Андроид?
Re: Ардуино - запись звука
Добавлено: Пт дек 30, 2022 20:46:25
roman.com
была такая мысль)) до андроид пока не дошёл... там чуть иначе... всякие манифесты писать надо и т.д.
для андроид есть своя среда разработки... от производителя))
Re: Ардуино - запись звука
Добавлено: Пт дек 30, 2022 23:12:13
olegue
может есть андроид студио
компилировать этот код
Код: Выделить всё
package rmd.media.StreamingAudio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.InvalidParameterException;
import java.net.InetAddress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.UnknownHostException;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.util.Log;
/** UdpStream activity sends and recv audio data through udp */
public class UdpStream extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.udpstream);
Button btnSend = (Button)findViewById(R.id.btnSend);
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(LOG_TAG, "btnSend clicked");
SendAudio();
}
});
Button btnRecv = (Button)findViewById(R.id.btnRecv);
btnRecv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(LOG_TAG, "btnRecv clicked");
RecvAudio();
}
});
}
static final String LOG_TAG = "UdpStream";
static final String AUDIO_FILE_PATH = "/data/1.wav";
static final int AUDIO_PORT = 2048;
static final int SAMPLE_RATE = 8000;
static final int SAMPLE_INTERVAL = 20; // milliseconds
static final int SAMPLE_SIZE = 2; // bytes per sample
static final int BUF_SIZE = SAMPLE_INTERVAL*SAMPLE_INTERVAL*SAMPLE_SIZE;
public void RecvAudio()
{
Thread thrd = new Thread(new Runnable() {
@Override
public void run()
{
Log.e(LOG_TAG, "start recv thread, thread id: "
+ Thread.currentThread().getId());
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,
SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, BUF_SIZE,
AudioTrack.MODE_STREAM);
track.play();
try
{
DatagramSocket sock = new DatagramSocket(AUDIO_PORT);
byte[] buf = new byte[BUF_SIZE];
while(true)
{
DatagramPacket pack = new DatagramPacket(buf, BUF_SIZE);
sock.receive(pack);
Log.d(LOG_TAG, "recv pack: " + pack.getLength());
track.write(pack.getData(), 0, pack.getLength());
}
}
catch (SocketException se)
{
Log.e(LOG_TAG, "SocketException: " + se.toString());
}
catch (IOException ie)
{
Log.e(LOG_TAG, "IOException" + ie.toString());
}
} // end run
});
thrd.start();
}
public void SendAudio()
{
Thread thrd = new Thread(new Runnable() {
@Override
public void run()
{
Log.e(LOG_TAG, "start send thread, thread id: "
+ Thread.currentThread().getId());
long file_size = 0;
int bytes_read = 0;
int bytes_count = 0;
File audio = new File(AUDIO_FILE_PATH);
FileInputStream audio_stream = null;
file_size = audio.length();
byte[] buf = new byte[BUF_SIZE];
try
{
InetAddress addr = InetAddress.getLocalHost();
DatagramSocket sock = new DatagramSocket();
audio_stream = new FileInputStream(audio);
while(bytes_count < file_size)
{
bytes_read = audio_stream.read(buf, 0, BUF_SIZE);
DatagramPacket pack = new DatagramPacket(buf, bytes_read,
addr, AUDIO_PORT);
sock.send(pack);
bytes_count += bytes_read;
Log.d(LOG_TAG, "bytes_count : " + bytes_count);
Thread.sleep(SAMPLE_INTERVAL, 0);
}
}
catch (InterruptedException ie)
{
Log.e(LOG_TAG, "InterruptedException");
}
catch (FileNotFoundException fnfe)
{
Log.e(LOG_TAG, "FileNotFoundException");
}
catch (SocketException se)
{
Log.e(LOG_TAG, "SocketException");
}
catch (UnknownHostException uhe)
{
Log.e(LOG_TAG, "UnknownHostException");
}
catch (IOException ie)
{
Log.e(LOG_TAG, "IOException");
}
} // end run
});
thrd.start();
}
}
отсюда
http://rxwen.blogspot.com/2011/10/strea ... droid.html
Добавлено after 9 minutes 58 seconds:
вероятно потребуется весь пакет. Тема двольно старая может я сам найду подходящий на тот момент , аэто 2012 год , компилятор
http://web.archive.org/web/201204131451 ... ing_audio/
Добавлено after 1 minute 45 seconds:
нашел его проект на гитхабе
https://github.com/rxwen/rxwen-blog-stu ... ming_audio
Добавлено after 19 minutes 50 seconds:
я там покопался в файлах, там вроде под эклипс, если он существовал в те времена.
Re: Ардуино - запись звука
Добавлено: Вт янв 03, 2023 11:18:47
roman.com
я смотрел видеоуроки на ютуб... там всё подробно... на примерах))
ethernet уже доделал ? надо что-то одно доделать... для начала))
Re: Ардуино - запись звука
Добавлено: Вт янв 03, 2023 23:28:33
olegue
ethernet еще не прибыл. Заказал 2 версии и такую как вы мне порекомендовали и под Нану.
но по приложению отработал на выходных
https://www.youtube.com/watch?v=fyaaMn6Av3s
поставил осюда
https://drive.google.com/file/d/1a2vg0m ... cUu7P/view
eclipse juno +Aндроид SDK
поставил java 6 jdk
Поробоовал скопилировать проект. К сожалению импорт проекта не удался. Кричит на Манифест. Манифест фообще не понимает. Тогда взял фйлы из layuot и src и перенес их в новых проект. Компилил его под Андрод 4.4. Небольшие ошибки опять повылазили, поправил. Проблема именео что проект очень старый, скорее всего он компилирся под Андроид 2.x или даже ниже. Пробовал ставить в sdk менеджере поддержку - не получилсь.
Короче , по итого проект скомпилился, под 4.4. я получил apk и я его запустил на своем телефоне. Но пока ничего не зработала, там есть процедура проигрывания , она в MainActivity, вроде как она должна играть 1.wav который лежит на data, но ругается на buffer. К сожалению проект отстался на другом компе. Завтра выложу. Может быть кто-то или , Вы , Роман занитересуетесь.
Добавлено after 18 minutes 5 seconds:
если б на гитхабе хоть писали какой версией компились
Добавлено after 1 hour 29 minutes 28 seconds:
Код: Выделить всё
import pyaudio
import socket
from threading import Thread
frames = []
def udpStream(CHUNK):
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind(("192.168.0.124", 4210))
while True:
soundData, addr = udp.recvfrom(CHUNK)
frames.append(soundData)
udp.close()
def play(stream, CHUNK):
BUFFER = 10
while True:
if len(frames) == BUFFER:
while True:
stream.write(frames.pop(0))
if __name__ == "__main__":
FORMAT = pyaudio.paInt8
CHUNK = 1024
CHANNELS = 1
RATE = 8000
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels = CHANNELS,
rate = RATE,
output = True,
frames_per_buffer = CHUNK,
)
Ts = Thread(target = udpStream, args=(CHUNK,))
Tp = Thread(target = play, args=(stream, CHUNK,))
Ts.setDaemon=True
Tp.setDaemon=True
Ts.start()
Tp.start()
Ts.join()
Tp.join()
еще вот на Python код нашел. Это код udp server для звука. Но не звучит. Очень плохой звук. Хотя Ваша прога воспроизводит хорошо.
Re: Ардуино - запись звука
Добавлено: Ср янв 04, 2023 12:25:06
olegue
Re: Ардуино - запись звука
Добавлено: Ср янв 04, 2023 14:47:58
roman.com
olegue писал(а):ethernet еще не прибыл. Заказал 2 версии и такую как вы мне порекомендовали и под Нану.
зачем 2 версии... они одинаковые))
а в чём разница ENC28J60 и W5500 ?
ENC28J60 работает только с ethernet пакетами... остальное (UDP) делает ардуина...
W5500 работает как с ethernet пакетами, так и делает остальное (UDP)... при этом ардуина отдыхает))
вывод: W5500 более универсальный. Поэтому рекомендую его.
до Aндроид SDK ещё не дошёл... у меня нет Aндроид... пока нет))
пытался писать на Python... мне не понравилось. Вернулся на знакомый Си и java ))
Добавлено after 2 minutes 58 seconds:
olegue писал(а):попробую тправить через Serial в Esp01 и принять по wifi. по крайней мере сериал справлвяется с потоком 64кбит.
доделай уже что-нибудь одно... чтоб работало))
Re: Ардуино - запись звука
Добавлено: Чт янв 05, 2023 11:30:17
olegue
roman.com писал(а):зачем 2 версии... они одинаковые))
всегда надо иметь 2 . В случае непредвидненных ситуация проект не будет остановлен.
roman.com писал(а):доделай уже что-нибудь одно... чтоб работало))
по поводу wifi и esp8266 ....
вот прекрасно работающий код
Код: Выделить всё
void loop()
{
Udp.beginPacket("192.168.0.124", 4210);
for(int i=0; i<1024;i++){
int old=micros();
float analog = analogRead(A0);
if (analog > 255) {
analog = 255;
}
else if (analog < 0){
analog = 0;
}
Udp.write(int(analog));
// Serial.print(int(analog));
// Serial.print(",");
while(micros()-old<125); // 90uSec = 1Sec/11111Hz - 3uSec para los otros procesos
}
//Serial.print(";;;;;");
Udp.endPacket();
delay(5);
}
Прнимаю его на Ваш java приемник без проблем
взято отсюда
https://arduino.stackexchange.com/quest ... eger-input
Андроид проект является продолжением этой темы. Т.е теперь я хочу принимать этоо сигнал на андроиде.
Счас разберусь с sdk и кнопками и выдам чего нить или найду готовое, что предпочтительнее, потому как правило это все уже написано.
Добавлено after 3 minutes 55 seconds:
Если честно, то я , грешным делом полагал после экспериментов c gprs на sim800, что Ваш приемник не очень корректно работает. Но теперь эти подозрения сняты. проблема именно в gprs передатчике. Но, как говорится, что ни делалется все к лучшем. В итоге поучли и передатчик на esp8266 и убедился что с Вашим приемником все хорошо.
Добавлено after 2 minutes 10 seconds:
Так, что Роман, ввсе идет своим чередом, хотя изза возникших проблем со здоровьем мне это последнее время еще более нелегко дается. Уделяь это столько времени как раньше становитсья все тяжелее.
Re: Ардуино - запись звука
Добавлено: Чт янв 05, 2023 15:00:13
roman.com
[uquote="olegue",url="/forum/viewtopic.php?p=4348561#p4348561"]я , грешным делом полагал после экспериментов c gprs на sim800, что Ваш приемник не очень корректно работает.[/uquote]
в своём приёмнике я не сомневался))
единственное что вызывает сомнения - выбег частоты.
в материнской плате стоят кварцы...
стабильность частоты кварца не идеальная...
поэтому через некоторое время может возникнуть выбег частоты приёмника и передатчика... получим рассинхронизацию...
-например передатчик будет передавать чуть с более высокой скорость (8001 семпл/с), а приёмник будут воспроизводить например чуть с меньшей скоростью (7999 семпл/c). Это приведёт сначала к задержкам воспроизведения... а потом и к переполнению буфера приёмника и потери пакета (в динамике услышим "заикания").
это надо проверить...
Добавлено after 3 minutes 41 second:
[uquote="olegue",url="/forum/viewtopic.php?p=4348561#p4348561"]по поводу wifi и esp8266 ....
вот прекрасно работающий код[/uquote]
в esp8266 тоже стоит кварц.
в esp8266 тоже стабильность частоты не идеальная)).
как долго ты его гонял в непрерывном режиме ?
1 час ? 2 часа ? выбег частоты проверял ?
например через 1 час непрерывной работы задержка воспроизведения осталась неизменной ?
вот если бы ты использовал атомные часы... например использующие полупериод распада цезия... то у меня бы не было бы сомнений в стабильности частоты))
Добавлено after 9 minutes 38 seconds:
короче... осталось проверить как работает по эзернет... и можно переходить к написанию своего мессенджера для андроид))
самодельный скайп для ПК у нас уже есть))
блин.. с этими праздниками некогда заняться программами... ))

Re: Ардуино - запись звука
Добавлено: Чт янв 05, 2023 20:11:12
olegue
На час оставлял, но тут нужно учитывать что wifi Тоже такая себе стабильность, не очень стабильная. Но работало неплох, но затыки были , причем совершенно нерегулярыные, системы я не заметил,счас занялся андроидом и пока сложил в коробку.
Re: Ардуино - запись звука
Добавлено: Пт янв 06, 2023 23:22:39
olegue
Вот если бы можно было организовать какой - нить образцовый стримовый передатчик. Тогда можно было бы отстраивать и проверять приемники
Добавлено after 3 hours 35 minutes 58 seconds:
Рабочий код для приемника Udp audio для Андроида.
Но с затыками еще предстоит бороться.
Код: Выделить всё
public void RecvAudio()
{
Thread thrd = new Thread(new Runnable() {
@Override
public void run()
{
Log.e(LOG_TAG, "start2 recv thread, thread id: "
+ Thread.currentThread().getId());
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,
SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_8BIT, BUF_SIZE,
AudioTrack.MODE_STREAM);
track.play();
DatagramSocket sock = null;
try
{
sock = new DatagramSocket(AUDIO_PORT);
byte[] buf = new byte[BUF_SIZE];
while(Server_aktiv)
{
DatagramPacket pack = new DatagramPacket(buf, BUF_SIZE);
sock.receive(pack);
Log.d(LOG_TAG, "recv pack: " + pack.getLength());
buf=pack.getData();
//track.write(pack.getData(), 0, pack.getLength());
track.write(buf, 0, buf.length);
}
}
catch (SocketException se)
{
Log.e(LOG_TAG, "SocketException: " + se.toString());
}
catch (IOException ie)
{
Log.e(LOG_TAG, "IOException" + ie.toString());
}
finally
{
if (sock != null)
{
sock.close();
Toast toast = Toast.makeText(getApplicationContext(),
"Сервер UDP остановлен. Пора покормить кота!", Toast.LENGTH_SHORT);
toast.show();
}
}
} // end run
});
thrd.start();
}
как приведу немного в порядок интерйфейс выложу apk и проект
Добавлено after 4 minutes 23 seconds:
с буфером надо поигратся.
тут
https://stackoverflow.com/questions/158 ... dp-packets
человек прелагал решения , но я не смог пока его применить.
Re: Ардуино - запись звука
Добавлено: Сб янв 07, 2023 00:50:56
roman.com
я не знаю как работает audio для Андроида.))
но судя по всему примерно так же как в java...
я бы для начала поигрался с сами плеером в Андроида... а потом уже думал как это передать - принять по UDP/
в java я так и сделал)) сначала поигрался с самим плеером... а топом добавил передачу - приём по UDP.
а топом ещё добавил запись на диск ПК... получился диктофон))
а том ещё добавил ползунки... получился индикатор уровня сигнала))
а потом ещё... можно добавить всякие визуальные эффекты))
а потом ещё... можно сделать звуковой редактор))
и т.д.
Код: Выделить всё
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,
SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_8BIT, BUF_SIZE,
AudioTrack.MODE_STREAM);
track.play();
track.write(buf, 0, buf.length);
Код: Выделить всё
try
{
sock = new DatagramSocket(AUDIO_PORT);
byte[] buf = new byte[BUF_SIZE];
while(Server_aktiv)
{
DatagramPacket pack = new DatagramPacket(buf, BUF_SIZE);
sock.receive(pack);
Log.d(LOG_TAG, "recv pack: " + pack.getLength());
buf=pack.getData();
//track.write(pack.getData(), 0, pack.getLength());
track.write(buf, 0, buf.length);
}
}
не логично))
лучше так...
Код: Выделить всё
try
{
sock = new DatagramSocket(AUDIO_PORT);
byte[] buf = new byte[BUF_SIZE];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
while(Server_aktiv)
{
sock.receive(pack);
//Log.d(LOG_TAG, "recv pack: " + pack.getAddress(); // IP String
//Log.d(LOG_TAG, "recv pack: " + pack.getPort(); // port int
Log.d(LOG_TAG, "recv pack: " + pack.getLength()); // len int
//buf=pack.getData();
//track.write(pack.getData(), 0, pack.getLength());
track.write(buf, 0, buf.length);
}
}
Re: Ардуино - запись звука
Добавлено: Пн янв 09, 2023 22:33:27
olegue
поставил VLC плейер, теперь слушаю стрим с esp8266 посредством этой строки
vlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=8000 --rawaud-fourcc "u8 " --network-caching=2000 udp://@:4210
прикольно.
Добавлено after 1 minute 55 seconds:
Но лаги остались!!!! ааааааааа. Счас заряжу трансляцию с vlc и попытаюсь принять. Интересно будут ли лаги.
Добавлено after 56 minutes 23 seconds:
Но VLC пока не удалось зарядить на трансляцию Raw данных, не хочет он их отправлять с интерфейса. Надо коммандную строку искать
Re: Ардуино - запись звука
Добавлено: Пн янв 09, 2023 23:47:16
roman.com
а шифрование будет ? )) или у тебя без шифрования... как WEB-радио))
https://www.radiokot.ru/forum/viewtopic ... 7&start=44
Re: Ардуино - запись звука
Добавлено: Вт янв 10, 2023 14:00:53
olegue
по ка мне не откого шифроваться. ХОчу просто наладить связь и разобраться в причинах лагов. Получается , и VLC и Ваше, Роман, java проигрыватетль одинаково принимают raw данные. Если бы мне удалось настроить отправку через vlc , а прием уже есть , то былоа бы полная ясность
Re: Ардуино - запись звука
Добавлено: Вт янв 10, 2023 15:22:20
roman.com
не совсем понятно зачем использовать VLC плеер...
у тебя же есть плееры java для ПК... и для андроид... и т.д.
а что умеет VLC плеер ?
пишут что умеет транслировать потоки по сети...
не пробовал))
а что умеет плеер андроид ?
умеет записывать поток...
Код: Выделить всё
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioRecord arec = new AudioRecord(
MediaRecorder.AudioSource.MIC, 11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffersize);
byte[] buffer = new byte[buffersize];
arec.startRecording();
//arec.read(buffer, 0, buffersize);
умеет воспроизводить поток...
Код: Выделить всё
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack aTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL, 11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffersize,
AudioTrack.MODE_STREAM);
byte[] buffer = new byte[buffersize];
aTrack.write(buffer, 0, buffer.length);
и т.д.))
Re: Ардуино - запись звука
Добавлено: Вт янв 10, 2023 16:45:08
olegue
roman.com писал(а):не совсем понятно зачем использовать VLC плеер...

в нем можно задать буфер по прием и протестировать поток на какойто линии что бы разобраться почему не работает что-то самодельное на андроиде или esp
домучаал таки vlc
отправил таки с него поток в нужном мне формате 8бит/8000кгц на свой самодельный андроид плейр
вот строка
vlc.exe 1.raw --sout=#transcode{acodec="u8 ",ab=64,channels=1}:duplicate{dst=std{access=udp,mux=raw,dst=192.168.10.141:4210}}
ну че сказать. Лаги остались, вероятно в андроид плейере нужно делать буфер.
еще попробоую чуть позже с vlc на vlc.
И еще на дня придет ЛАН
Re: Ардуино - запись звука
Добавлено: Чт янв 12, 2023 13:42:01
olegue
пришел модуль 5500 . но готовых кодов нету под него. Надо писать, как я понял