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
streamARM
それを消費するには、ストリーミングの開始とストリーミングの停止を呼び出すときに、Amazon コネクトによって作成された有効なものが必要です。関連する Amazon コネクトの統合は次のとおりです。
コールセンターに電話し、AWS Lambda でストリームを処理すると、ファイルを取得できますfoo.flv
。Amazon Kinesis Video Streams PUT_MEDIA
ドキュメントによると、これは AAC 形式のオーディオを含むトラックを含む Matroska (MKV) コンテナー形式です。
のような OpenSource ツールを使用するとMKVToolNix
、ファイルを再生してオーディオを聞くことができず、その理由がわかりません。ファイルを(デコードせずに)wavとして強制すると、録音されたオーディオが非常にうるさいです(情報はそこにあります)。解析されたペイロードには、AWS タグといくつかの情報が含まれており、出力として次のようになります。GStreamer
vlc
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
理論的には (この 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 チャンクを解析して 1 つまたは複数の AAC/WAV ファイルを正しく生成するには、ダーティ ハックを使用する必要はありません。