Приём звукового потока python скриптом

Модератор: Модераторы разделов

Аватара пользователя
denel
Сообщения: 481
ОС: Gentoo Linux

Приём звукового потока python скриптом

Сообщение denel »

Подсмотрел/подкорректировал скриптик

Код: Выделить всё

#!/usr/bin/python3
from socket import *
import sys
import base64

if (len(sys.argv)==3 and sys.argv[1]=='-l'):
    try:
        port=int(sys.argv[2])
    except ValueError as verr:
        print('Invalid port number')
        sys.exit(1)
    try:
        s=socket(AF_INET, SOCK_DGRAM)
        s.bind(('',port))
        while True:
            data,address=s.recvfrom(1500)
            data = base64.b64encode(data)
            print(data.decode('utf-8'))
        s.close()

    except (KeyboardInterrupt, SystemExit):
        s.close()
        print('Exit on Keyboard Interrupt')

else:
     	print('UDP socket listener by JirkaRCK v1.0\nArguments:\n-l Listen on specific UDP port')
Скрипт принимает поток вроде как и отдаёт в base64. Я проверил, пакет из base64 декодирую обратно и отправляю с помощью bash в udp на порт, скрипт получает этот пакет и выводит его изначальный base64 вид. Всё хорошо, но когда я декодирую поток и пытаюсь скормить его в vlc по stdin, у меня ничего не получается. Что ему не нравится? В TS потоке есть то, что нельзя скормить через stdin?...

UPD 15.10.2020:
А вот сейчас попробовал вот так

Код: Выделить всё

awk 'BEGIN {
  while (1) {
    "/inet/udp/1299/0/0" |& getline
    print $0
    fflush()
  }
}'
Скармливаю это в VLC и всё нормально работает. Значит что-то в python скрипте не так...
Спасибо сказали:

Аватара пользователя
denel
Сообщения: 481
ОС: Gentoo Linux

Re: Приём звукового потока python скриптом

Сообщение denel »

Короче в python скрипте оказалось всё нормально. Но VLC, который отправляет поток, отправлял похоже его дважды с двух разных портов (с помощью tcpdump увидел). Перезапуск этого VLC помог. В связи с чем немного видоизменил скрипт:

Код: Выделить всё

#!/usr/bin/python3
from socket import *
import sys
import base64
import binascii


if (len(sys.argv)==3 and sys.argv[1]=='-l'):
    try:
        port=int(sys.argv[2])
    except ValueError as verr:
        print('Invalid port number')
        sys.exit(1)
    try:
        srcPortOld = 0
        actSrcPort = 0
        n = 0
        s=socket(AF_INET, SOCK_DGRAM)
        s.bind(('',port))
        while True:
            data,address=s.recvfrom(1500)
            srcAddr,srcPort = address
            if (actSrcPort == 0 or n > 9): actSrcPort = srcPort
            if (srcPort == actSrcPort):
              data = base64.b64encode(data)
              print(data.decode('utf-8'))
              n = 0
            else:
              n = n + 1
            srcPortOld = srcPort
        s.close()

    except (KeyboardInterrupt, SystemExit):
        s.close()
        print('Exit on Keyboard Interrupt')

else:
        print('UDP socket listener by JirkaRCK v1.0\nArguments:\n-l Listen on specific UDP port')
Спасибо сказали: