La aplicación ffmpeg en el entorno del sistema informático no se puede utilizar en el entorno conda; ffmpeg llama al micrófono local de Windows para leer

1. ffmpegzai no se puede ejecutar en el entorno conda, pero se puede ejecutar en el sistema

import ffmpeg

stream = ffmpeg.input(r'D:\sound\222.mp4')
stream = ffmpeg.filter(stream, 'fps', fps=25, round='up')
stream = ffmpeg.output(stream, r'D:\sound\dummy2.mp4')
ffmpeg.run(stream)

Se informará un error:
Archivo “C:\Users\loong.conda\envs\nlp\lib\subprocess.py”, línea 1435, en _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(ejecutable, args,
FileNotFoundError : [WinError 2] El sistema no puede encontrar el archivo especificado.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Solución, ejecutar con todas las rutas absolutas puede ejecutarse normalmente

C:/Users/loong/.conda/envs/nlp/python.exe  D:\sound\ffmpeg_sounddevice.py

inserte la descripción de la imagen aquí

2. ffmpeg llama al micrófono local de Windows para leer

(Esto se utiliza para otros acoplamientos de datos posteriores, y se formulan "-f", "s16le",
"-acodec", "pcm_s16le",
"-ar", "16000", valores de muestreo )

Ver el nombre del dispositivo: ffmpeg -list_devices true -f dshow -i dummy
inserte la descripción de la imagen aquí

ffmpeg_cmd = [
    "ffmpeg",
    "-f", "dshow",  # 使用alsa作为音频输入设备
    "-i", "audio=麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)",  # 使用默认的音频输入设备(麦克风)
    "-f", "s16le",
    "-acodec", "pcm_s16le",
    "-ar", "16000",
    "-ac", "1",
    "-"
]
ffmpeg_cmd = [
    "ffmpeg",
    "-f", "dshow",  # 使用dshow作为音频输入设备(名字必须是这个,其他会报错)
    "-i", "audio=Microphone",  # 麦克风的设备名称
    "-f", "s16le",
    "-acodec", "pcm_s16le",
    "-ar", "16000",
    "-ac", "1",
    "-"
]

Este comando utilizará dshow como dispositivo de entrada de audio y especificará el dispositivo de micrófono denominado Micrófono. Si está utilizando un nombre de dispositivo de micrófono diferente, puede reemplazarlo con el nombre de su dispositivo real.

Los otros parámetros tienen el mismo significado que el ejemplo de Linux mencionado anteriormente: -f s16le especifica que el formato de audio de salida es audio PCM sin comprimir de 16 bits, -acodec pcm_s16le especifica que el códec de audio es audio PCM sin comprimir de 16 bits, -ar 16000 especifica la frecuencia de muestreo Para 16000 Hz, -ac 1 especifica que el número de canales sea 1 (mono).

Finalmente, el nombre del archivo de salida se reemplaza con - para indicar que los datos de audio se transmitirán a través de la salida estándar en lugar de escribirse en un archivo.

Tenga en cuenta que los parámetros de comando anteriores se aplican al sistema Windows y DirectShow se utiliza como dispositivo de entrada de audio. Si está ejecutando en otro sistema operativo, use el dispositivo de entrada de audio y los argumentos de comando apropiados.

import subprocess

import numpy as np


ffmpeg_cmd = [
    "ffmpeg",
    "-f", "dshow",  # 使用alsa作为音频输入设备
    "-i", "audio=麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)",  # 使用默认的音频输入设备(麦克风)
    "-f", "s16le",
    "-acodec", "pcm_s16le",
    "-ar", "16000",
    "-ac", "1",
    "-"
]

# 创建FFmpeg进程
process = subprocess.Popen(
    ffmpeg_cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.DEVNULL,
    bufsize=1600
)


# 读取和处理音频数据
while True:
    # 从FFmpeg进程中读取音频数据
    data = process.stdout.read(frames_per_read * channels * 2)  # 每个样本16位,乘以2
    if not data:
        break
    
    # 将音频数据转换为numpy数组
    samples = np.frombuffer(data, dtype=np.int16)
    samples = samples.astype(np.float32)
    # samples = MinMaxScaler(feature_range=(-1, 1)).fit_transform(samples.reshape(-1, 1))
    samples /= 32768.0  # 归一化到[-1, 1]范围
    ##数据后续处理逻辑

ffmpeg guarda una computadora local cada pocos segundos

Valores de muestreo locales "-f", "wav",
"-acodec", "pcm_s16le",
"-ar", "44100",
"-ac", "2", la computadora local puede reproducir normalmente

import subprocess
import time
import numpy as np



i = 0
while True:
    start_time = time.time()

    output_file = f"D:\llm\output{i}.wav"  # 创建输出文件名,例如output0.wav, output1.wav, ...

    ffmpeg_cmd = [
        "ffmpeg",
        "-f", "dshow",
        "-i", "audio=麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)",
        "-f", "wav",
        "-acodec", "pcm_s16le",
        "-ar", "44100",
        "-ac", "2",
        output_file,
    ]
    process = subprocess.Popen(ffmpeg_cmd)


    # 等待两秒
    time.sleep(2)

    # 终止ffmpeg进程
    process.terminate()

    i += 1

Supongo que te gusta

Origin blog.csdn.net/weixin_42357472/article/details/131441793
Recomendado
Clasificación