无法通过 Python 中 boto3 中的 kinesis 视频客户端从 Amazon Connect 恢复音频

vgo*_*anz 6 python boto3 aws-lambda amazon-connect amazon-kinesis-video-streams

我正在尝试从 AWS-Lambda 实例中 Python 的 kinesis 视频流中获取音频文件。

要获取音频,我正在使用以下代码片段:

 def download_stream(self, streamARM, ms_start_timestamp):
        tmpfile = os.path.join('/tmp', str(uuid.uuid4()) + '.mkv')

        logger.debug("get_data_endpoint", tmpfile=tmpfile, streamARM=streamARM, ms_start_timestamp=ms_start_timestamp)
        response = self._kinesisvideo_client.get_data_endpoint(
           StreamARN=streamARM,
           APIName='GET_MEDIA')

        data_endpoint = response['DataEndpoint']
        logger.debug("get_data_endpoint", endpoint_url=data_endpoint)
        video_client = boto3.client('kinesis-video-media', endpoint_url=data_endpoint)
        stream = video_client.get_media(
           StreamARN=streamARM,
           StartSelector={'StartSelectorType': 'EARLIEST'})

        time.sleep(1)
        logger.debug("stream", stream=stream)
        streamingBody = stream['Payload']

        # This write a mkv chunk, seems corrupted
        with open(tmpfile, 'w+b') as f:
            f.write(streamingBody.read())

        logger.debug("recorded_file", tmpfile=tmpfile)
        return True, tmpfile
Run Code Online (Sandbox Code Playgroud)

要使用它,您只需要streamARM在调用开始流式传输和停止流式传输时由 Amazon connect 创建的有效信息,相关的 Amazon connect 集成是这样的:

亚马逊连接集成

在呼叫呼叫​​中心并在 AWS Lambda 中处理流后,我可以获得一个文件foo.flv. 根据Amazon Kinesis Video Streams PUT_MEDIA 文档,它是一种 Matroska (MKV) 容器格式,带有 AAC 格式的音频轨道。

使用开放源代码工具喜欢MKVToolNixGStreamer而且vlc我无法播放收听音频文件,我不明白为什么不能。如果我将文件强制为 wav(不解码),我会听到非常嘈杂的录制音频(信息在那里)。解析的有效负载包含 AWS 标签和一些信息,mkvinfo test_03s_current.mkv作为输出提供:

+ EBML head
|+ EBML version: 1
|+ EBML read version: 1
|+ Maximum EBML ID length: 4
|+ Maximum EBML size length: 8
|+ Document type: matroska
|+ Document type version: 2
|+ Document type read version: 2
+ Segment: size unknown
|+ Tags
| + Tag
|  + Simple
|   + Name: ContactId
|   + String: b1e0f302-2d60-4dcf-98af-77ef3baa0b0b
|+ Tags
| + Tag
|  + Simple
|   + Name: InstanceId
|   + String: f1f87e8c-ae31-4f00-86dd-ea630fcd9fe5
|+ Tags
| + Tag
|  + Simple
|   + Name: MimeType
|   + String: audio/L16;rate=8000;channels=1;
|+ Tags
| + Tag
|  + Simple
|   + Name: AUDIO_FROM_CUSTOMER
|   + String: 1
|+ Segment information
| + Segment UID: 0xc0 0x54 0x2a 0xab 0xba 0x4e 0xf8 0xf6 0xc7 0x16 0x9e 0x73 0x11 0x08 0xdb 0x04
| + Timestamp scale: 1000000
| + Title: Kinesis Video SDK
| + Multiplexing application: Kinesis Video SDK 1.0.0 JNI 2.0
| + Writing application: Kinesis Video SDK 1.0.0 JNI 2.0
|+ Tracks
| + Track
|  + Track number: 1 (track ID for mkvmerge & mkvextract: 0)
|  + Track UID: 1
|  + Track type: audio
|  + Name: AUDIO_FROM_CUSTOMER
|  + Codec ID: A_AAC
|  + Codec's private data: size 2
|+ Tags
| + Tag
|  + Simple
|   + Name: AWS_KINESISVIDEO_FRAGMENT_NUMBER
|   + String: 91343852333181432392682062632260670078128844116
|  + Simple
|   + Name: AWS_KINESISVIDEO_SERVER_TIMESTAMP
|   + String: 1603184119.798
|  + Simple
|   + Name: AWS_KINESISVIDEO_PRODUCER_TIMESTAMP
|   + String: 1603184119.671
|+ Cluster
Run Code Online (Sandbox Code Playgroud)

从理论上讲(此 GStreamer 管道与具有轨道 0 音频的有效 mkv 文件一起使用)应该可以工作,因为它可以工作:

gst-launch-1.0 filesrc location=test.mkv ! queue ! matroskademux name=dmux dmux.audio_0 ! queue ! aacparse ! faad ! audioconvert ! alsasink

您可以使用 GStreamer 和以下命令生成脉冲以对其进行测试: gst-launch-1.0 -v audiotestsrc num-buffers=100 ! audioconvert ! voaacenc ! matroskamux ! filesink location=foo.mkv

GStreamer 似乎是一个很好的候选者,因为它有一个 Python 的包装器,在这个问题中,流解析器库lherman-cs解释了二进制格式将如何到达。

使用mkvextract test_03s_current.mkv tracks 0:audio.aac我能够生成 aac 文件(它检测容器格式:带有 ADTS 标头的原始 AAC 文件)但它也不起作用。

如何解析 MKV 块以正确生成一个或多个 AAC/WAV 文件而不使用脏黑客?