微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试从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

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

Amazon connect integration

致电呼叫中心,并在AWS Lambda中处理流后,我可以获得文件foo.flv。根据{{​​1}} documentation,这是一种Matroska(MKV)容器格式,带有带有AAC格式音频的轨道。

使用Amazon Kinesis Video Streams PUT_MEDIAMKVToolNixGStreamer之类的OpenSource工具,我无法播放文件来收听音频,也无法弄清楚为什么不这样做。如果我强制将文件作为wav文件(不进行解码),我会非常嘈杂地收听录制的音频(信息在那里)。解析的有效负载包含AWS标记和一些信息,vlc给出作为输出

mkvinfo test_03s_current.mkv

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

+ 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

您可以通过以下命令使用GStreamer生成脉冲以对其进行测试:gst-launch-1.0 filesrc location=test.mkv ! queue ! matroskademux name=dmux dmux.audio_0 ! queue ! aacparse ! faad ! audioconvert ! alsasink

GStreamer似乎是一个不错的选择,因为它具有Python的包装,在流解析器库gst-launch-1.0 -v audiotestsrc num-buffers=100 ! audioconvert ! voaacenc ! matroskamux ! filesink location=foo.mkv的{​​{3}}问题中,解释了二进制格式将如何到达。

使用lherman-cs可以生成aac文件(它检测容器格式:带有ADTS标头的原始AAC文件),但两者都不起作用。

我如何解析MKV块以正确生成一个或多个AAC / WAV文件,而无需使用肮脏的hacks?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。