Найти - Пользователи
Полная версия: Запись с динамиков
Начало » Python для экспертов » Запись с динамиков
1 2
Mitkin
Здравствуйте.

Не смог найти код для записи звука с динамиков.

Тот, который нашёл, выдаёт ошибку. Ниже пример такого кода:
 import pyaudio
import wave
chunk = 1024  # Record in chunks of 1024 samples
sample_format = pyaudio.paInt16  # 16 bits per sample
channels = 2
fs = 44100  # Record at 44100 samples per second
seconds = 3
filename = "output.wav"
p = pyaudio.PyAudio()  # Create an interface to PortAudio
#Select Device
print ( "Available devices:\n")
for i in range(0, p.get_device_count()):
    info = p.get_device_info_by_index(i)
    print ( str(info["index"]) +  ": \t %s \n \t %s \n" % (info["name"], p.get_host_api_info_by_index(info["hostApi"])["name"]))
    pass
#ToDo change to your device ID
device_id = 7
device_info = p.get_device_info_by_index(device_id)
channels = device_info["maxInputChannels"] if (device_info["maxOutputChannels"] < device_info["maxInputChannels"]) else device_info["maxOutputChannels"]
# https://people.csail.mit.edu/hubert/pyaudio/docs/#pyaudio.Stream.__init__
stream = p.open(format=sample_format,
                channels=channels,
                rate=int(device_info["defaultSampleRate"]),
                input=True,
                frames_per_buffer=chunk,
                input_device_index=device_info["index"],
                as_loopback=True
                )
frames = []  # Initialize array to store frames
print('\nRecording', device_id, '...\n')
# Store data in chunks for 3 seconds
for i in range(0, int(fs / chunk * seconds)):
    data = stream.read(chunk)
    frames.append(data)
# Stop and close the stream
stream.stop_stream()
stream.close()
# Terminate the PortAudio interface
p.terminate()
print('Finished recording')
# Save the recorded data as a WAV file
wf = wave.open(filename, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(sample_format))
wf.setframerate(fs)
wf.writeframes(b''.join(frames))
wf.close()
ошибка в строке:
 stream = p.open(format=sample_format,
                channels=channels,
                rate=int(device_info["defaultSampleRate"]),
                input=True,
                frames_per_buffer=chunk,
                input_device_index=device_info["index"],
                as_loopback=True
                )
если что, то микрофон у меня отсутствует. Интересует запись именно с динамиков.
Alex.Pro.
Mitkin
микрофон у меня отсутствует. Интересует запись именно с динамиков
Другими словами, звук выводит какой-то сторонний процесс, а вы пытаетесь перехватить этот вывод? Я правильно понимаю?
Mitkin
Alex.Pro.
Да. Я просто запустил мелодию на компе и хочу её записать.
Alex.Pro.
Боюсь, что вы неправильным путём идёте, товарищ. При записи с микрофона (или линейного входа) аналоговый сигнал поступает на вход АЦП, работой которого управляет библиотека pyaudio, а цифровой поток с выхода АЦП захватывается с помощью wave. В вашем случае ситуация обратная. Цифровой поток из файла подаётся на вход ЦАП, работой которого управляет программа-плейер и аналоговый сигнал с выхода ЦАП выводится на динамик. Обратно оцифровывать аналоговый сигнал нет ни необходимости, ни возможности. Вам надо суметь перехватить цифровой поток на входе ЦАП. Но я не знаю как это сделать.
xam1816
Mitkin
Да. Я просто запустил мелодию на компе и хочу её записать.
Так у тебя есть файл с мелодией, куда ты его хочешь записать? В другой файл?какой смысл, файл уже есть. Или слушаешь мелодию из интернета? То тогда нужно записывать из потока в файл, то тут другой подход нужен
Mitkin
xam1816
Это неважно, задачи могут быть разными, я привёл пример.

Из интернета можно скачивать не всё.
Mitkin
xam1816
Мне как раз нужна запись из потока
Alex.Pro.
Mitkin
Мне как раз нужна запись из потока
Т.е. не оцифровать аудиосигнал, как можно было подумать глядя на первое сообщение, а перехватить поток данных. А это, как говорят у нас в Одессе, две большие разницы. Это очень разные задачи. Потому и было сказано:
xam1816
тут другой подход нужен
Mitkin
Alex.Pro.
да мне хоть какое решение для начала, главное, чтобы работало. В названии темы про микрофон ни слово.
Mitkin
Alex.Pro.
Боюсь, что вы неправильным путём идёте, товарищ. При записи с микрофона (или линейного входа) аналоговый сигнал поступает на вход АЦП, работой которого управляет библиотека pyaudio, а цифровой поток с выхода АЦП захватывается с помощью wave. В вашем случае ситуация обратная. Цифровой поток из файла подаётся на вход ЦАП, работой которого управляет программа-плейер и аналоговый сигнал с выхода ЦАП выводится на динамик. Обратно оцифровывать аналоговый сигнал нет ни необходимости, ни возможности. Вам надо суметь перехватить цифровой поток на входе ЦАП. Но я не знаю как это сделать.

библиотека pyaudio выдала устройства
7-ое устройство разве не то, что требуется?
Available devices:

0: Microsoft Sound Mapper - Output
MME

1: Динамики (High Definition Audio
MME

2: Digital Audio (S/PDIF) (High De
MME

3: Digital Audio (S/PDIF) (High De
MME

4: Первичный звуковой драйвер
Windows DirectSound

5: Динамики (High Definition Audio Device)
Windows DirectSound

6: Digital Audio (S/PDIF) (High Definition Audio Device)
Windows DirectSound

7: Digital Audio (S/PDIF) (High Definition Audio Device)
Windows DirectSound

8: Динамики (High Definition Audio Device)
Windows WASAPI

9: Digital Audio (S/PDIF) (High Definition Audio Device)
Windows WASAPI

10: Digital Audio (S/PDIF) (High Definition Audio Device)
Windows WASAPI

11: Speakers (HD Audio Speaker)
Windows WDM-KS

12: SPDIF Out (HD Audio SPDIF out 2)
Windows WDM-KS

13: SPDIF Out (HD Audio SPDIF out)
Windows WDM-KS
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB