如何发送双向音频的音频 API 海康威视.



我需要帮助来理解为什么在将音频发送到相机时,您会听到很难听的声音,非常快。摄像机配置音频编解码器G711Ulaw

我正在执行的过程如下:

  • 我下载了一个wav音频并转换为配置相机的编解码器,这些都是证据转换。

    ffmpeg -i padrino.wav -acodec pcm_mulaw -ar 8000 -ac 1 -b:a 32k output.wav  
    ffmpeg -i padrino.wav -acodec pcm_mulaw -ar 8000 -ac 2 -b:a 32000 output.wav  
    ffmpeg -i padrino.wav -f mulaw -acodec pcm_mulaw -ac 1 output.wav  
    ffmpeg -i padrino.wav -ar 8000 -ac 1 -ab 64k -f mulaw output.ulaw
    
  • 打开双向音频,在"data.xml"中是启用双向音频的 xml:

    curl -H "application/xml" -X PUT -d @data.xml USER:PASS@IPCAM/ISAPI/System/...hannels/1/open
    
  • 通过卷发发送

    curl -H "application/binary" -X PUT -d @output.ulaw USER:PASS@IPCAM/ISAPI/System/...ls/1/audioData
    

    curl -H "application/binary" -X PUT -d @output.wav USER:PASS@IPCAM/ISAPI/System/...ls/1/audioData
    

这是在相机中听到的,但正如我在开始时解释的那样,听错了,我失真了,非常快。我做错了什么?

问候

我已经找到了为什么会这样 - 这与编码无关。我编写了一个 C# 应用程序来测试这一点,如果您以预期的速率(每秒 8000 个样本)发送数据,那么它会正确运行。

我以数据包的形式发送音频数据(目前为 160 字节,但尝试使用最佳值,但只要延迟正确,似乎并不重要)并在再次发送之前延迟适当的时间量,以便在一秒钟内发送正确数量的样本。

我在 github 上发现了一个有趣的项目,它帮助我创建了这个简单的应用程序,可以使用 python 将音频发送到相机:

import urllib.request
import requests
import socket
import time

class SocketGrabber:
    """ A horrible hack, so as to allow us to recover
        the socket we still need from urllib """
    def __init__(self):
        self.sock = None
    def __enter__(self):
        self._temp = socket.socket.close
        socket.socket.close = lambda sock: self._close(sock)
        return self
    def __exit__(self, type, value, tb):
        socket.socket.close = self._temp
        if tb is not None:
            self.sock = None
    def _close(self, sock):
        if sock._closed:
            return
        if self.sock == sock:
            return
        if self.sock is not None:
            self._temp(self.sock)
        self.sock = sock

audio_file = "output.ulaw"
ip = "IPCAM"
username = "USER"
password = "PASS"
index = 1
base = f"http://{ip}"
chunksize = 128
sleep_time = 1.0 / 64
base_url = f"http://{username}:{password}@{ip}"
req = requests.put(
    f"{base_url}/ISAPI/System/TwoWayAudio/channels/{index}/open")
mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
mgr.add_password(None, [base], username, password)
auth = urllib.request.HTTPDigestAuthHandler(mgr)
opener = urllib.request.build_opener(auth)
audiopath = f"{base}/ISAPI/System/TwoWayAudio/channels/{index}/audioData"
with SocketGrabber() as sockgrab:
    req = urllib.request.Request(audiopath, method='PUT')
    resp = opener.open(req)
    output = sockgrab.sock

def frames_yield(ulaw_data, chunksize=128):
    for i in range(0, len(ulaw_data), chunksize):
        for x in [ulaw_data[i:i + chunksize]]:
            tosend = x + (b'xff' * (chunksize - len(x)))
            time.sleep(sleep_time)
            yield tosend

with open(audio_file, 'rb') as file_obj:
    ulaw_data = file_obj.read()
    for dataframe in frames_yield(ulaw_data, chunksize):
        output.send(dataframe)

最新更新