Не удалось восстановить аудио из Amazon Connect через kinesis video client в boto3 на Python

#python #aws-lambda #boto3 #amazon-connect #amazon-kinesis-video-streams

#python #aws-lambda #boto3 #amazon-connect #amazon-kinesis-video-streams

Вопрос:

Я пытаюсь получить аудиофайл из видеопотока kinesis на Python в экземпляре AWS-Lambda.

Чтобы получить аудио, я использую этот фрагмент кода:

  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
  

Чтобы использовать его, вам просто нужно действительное streamARM значение, созданное Amazon connect при вызове start streaming и stop streaming, соответствующая интеграция Amazon connect заключается в следующем:

Интеграция с Amazon connect

После вызова call center и обработки потока в AWS Lambda я могу получить файл foo.flv . Согласно Amazon Kinesis Video Streams PUT_MEDIA документации, это формат контейнера Matroska (MKV) с дорожкой со звуком в формате AAC.

Используя инструменты с открытым исходным кодом, такие как MKVToolNix , GStreamer и 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 amp; 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 работает с допустимым файлом mkv с аудио дорожки 0) должен работать, потому что он работает:

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, в этом выпуске в библиотеке stream parser lherman-cs объясняется, как должен поступать двоичный формат.

Используя mkvextract test_03s_current.mkv tracks 0:audio.aac , я могу сгенерировать файл aac (он определяет формат контейнера: необработанный файл AAC с заголовками ADTS), но он тоже не работает.

Как я могу проанализировать фрагменты MKV для правильного создания одного или нескольких файлов AAC / WAV без использования грязных хаков?

Комментарии:

1. привет, @vgonisanz, вы нашли какое-либо обходное решение для этого?

2. Обходной путь заключается в использовании анализатора Amazon Kinesis (на Java) для создания wav-файла для использования в вашем приложении. К настоящему времени у меня нет альтернативы для его анализа с помощью инструмента python, gstreamer, другого инструмента. Ссылка: github.com/aws/amazon-kinesis-video-streams-parser-library