2 अमेज़न आईवीएस चैट लॉगिंग के साथ वेब चैट संदेशों को संग्रहित करना |
3 Amazon IVS लाइव स्ट्रीम प्लेबैक चैट रिप्ले के साथ |
इस समस्या को हल करने का प्रयास करते समय, मेरा पहला विचार लाइव स्ट्रीम से जुड़े मेटाडेटा पर एक नज़र डालना था ताकि यह देखा जा सके कि इसमें कोई मूल्यवान जानकारी छिपी हुई है या नहीं। शुक्र है, मेटाडेटा की नियमित धारा में एक मान प्रतीत होता है जिसका उपयोग हमारे चैट प्लेबैक उद्देश्यों के लिए किया जा सकता है। मेरे परीक्षण में, प्रत्येक स्ट्रीम में ID3 मेटाडेटा होता है जो Amazon IVS ट्रांसकोडिंग प्रक्रिया द्वारा इंजेक्ट किया गया प्रतीत होता है। इन ID3 टैग में एक उपयोगी टाइमस्टैम्प होता है जिसका उपयोग हम चैट रीप्ले में मदद के लिए कर सकते हैं। इन घटनाओं को सुनने के लिए, हम एक हैंडलर संलग्न कर सकते हैं जो IVSPlayer.MetadataEventType.ID3
ईवेंट प्रकार को सुनता है। यह घटना प्रकार प्रलेखित है , लेकिन इसके बारे में बहुत कुछ नहीं कहते हैं या इसमें क्या शामिल हो सकता है इसके बारे में कोई गारंटी नहीं देते हैं।
अप्रमाणित सुविधाओं से बचना चाहते हैं ? यदि आप एक गैर-दस्तावेज सुविधा का उपयोग करने के बारे में चिंतित हैं, तो आप सकते हैं जब नए संदेश आपके Amazon IVS चैट रूम में पोस्ट किए जाते हैं। ध्यान रखें कि एपीआई के माध्यम से
PutMetadata
ईवेंट हैं।
आइए प्लेयर SDK का उपयोग करके रिकॉर्ड की गई स्ट्रीम को प्लेबैक करने के लिए Amazon IVS प्लेयर सेट अप करें। सबसे पहले, हम नवीनतम Amazon IVS प्लेयर SDK को <script>
टैग के माध्यम से शामिल करेंगे।
अमेज़ॅन आईवीएस के लिए नया? देखें। यदि आरंभ करने के बारे में आपके कोई प्रश्न हैं, तो उस श्रृंखला (या नीचे) में किसी भी पोस्ट पर एक टिप्पणी पोस्ट करें!
<script src="//player.live-video.net/1.16.0/amazon-ivs-player.min.js"></script>
हमेशा की तरह, हमें अपने HTML मार्कअप में एक <video>
तत्व शामिल करना होगा जिसका उपयोग प्लेबैक के लिए किया जाएगा।
<video id="video-player" muted controls autoplay playsinline></video>
const streamUrl = '//[redacted].cloudfront.net/ivs/v1/[redacted]/[redacted]/2022/11/17/18/6/[redacted]/media/hls/master.m3u8'; const videoEl = document.getElementById('video-player'); const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(videoEl); ivsPlayer.load(streamUrl); ivsPlayer.play();
ivsPlayer.addEventListener(IVSPlayer.PlayerState.PLAYING, (evt) => { window.time = Date.now(); });
ivsPlayer.addEventListener(IVSPlayer.MetadataEventType.ID3, (evt) => { const now = Date.now(); console.log(`${(now - window.time) / 1000} seconds since last event`); window.time = now; });
window.ivsPlayer.addEventListener(IVSPlayer.MetadataEventType.ID3, (evt) => { console.log(evt); });
यह बहुत ही रोचक जानकारी है, लेकिन थोड़ी गूढ़ है। मेरे परीक्षण के आधार पर, transc_s
टाइमस्टैम्प लगता है कि हम बाद में हैं। आइए उस टाइमस्टैम्प को पकड़ने और लॉग इन करने के लिए इवेंट हैंडलर को संशोधित करें।
window.ivsPlayer.addEventListener(IVSPlayer.MetadataEventType.ID3, (evt) => { const segmentMetadata = evt.find((tag) => tag.desc === 'segmentmetadata'); const segmentMetadataInfo = JSON.parse(segmentMetadata.info[0]); const timestamp = segmentMetadataInfo['transc_s']; const timestampWithMs = timestamp * 1000; console.log(timestampWithMs); console.log(new Date(timestamp)); });
जब मेरा पृष्ठ लोड होता है, तो मैं इस श्रृंखला में पिछली पोस्ट [टूडू: लिंक] में उल्लिखित विधि का उपयोग स्ट्रीम के लिए संपूर्ण चैट लॉग को पुनः प्राप्त करने और इसे चैट कंटेनर <div>
में प्रस्तुत करने के लिए कर सकता हूं। चूंकि स्ट्रीम की शुरुआत में कोई संदेश दिखाई नहीं देना चाहिए, इसलिए मैं यह सुनिश्चित करूँगा कि वे कॉल में एक वर्ग शामिल करें जो उन्हें उपयोगकर्ता से छुपाता है और डेटा विशेषता को उचित टाइमस्टैम्प के साथ संग्रहीत करता है ताकि मुझे पता चल सके कि कौन से संदेश दिखाई देने चाहिए स्ट्रीम में कोई टाइमस्टैम्प दिया गया।
window.chatLog = await getChatLogs(logGroupName, chatArn, startTime, endTime); renderChat();
मेरा renderChat()
फ़ंक्शन प्रत्येक संदेश को चैट कंटेनर में पोस्ट करने का काम करता है।
const renderChat = () => { const chatContainer = document.getElementById('chat'); window.chatLog.forEach(msg => { const msgTemplate = document.getElementById('chatMsgTemplate'); const msgEl = msgTemplate.content.cloneNode(true); const ts = new Date(msg.event_timestamp).getTime() * 1000; msgEl.querySelector('.msg-container').setAttribute('data-timestamp', ts); msgEl.querySelector('.chat-username').innerHTML = msg.payload.Attributes.username; msgEl.querySelector('.msg').innerHTML = msg.payload.Content; chatContainer.appendChild(msgEl); }); };
अब मैं replayChat()
फ़ंक्शन को कॉल करने के लिए ID3 श्रोता को संशोधित कर सकता हूं और इसे वर्तमान टाइमस्टैम्प पास कर सकता हूं।
window.ivsPlayer.addEventListener(IVSPlayer.MetadataEventType.ID3, (evt) => { const segmentMetadata = evt.find((tag) => tag.desc === 'segmentmetadata'); const segmentMetadataInfo = JSON.parse(segmentMetadata.info[0]); const timestamp = segmentMetadataInfo['transc_s']; const timestampWithMs = timestamp * 1000; replayChat(timestampWithMs); });
replayChat()
में, मैं उन सभी चैट नोड्स को ढूंढ सकता हूं जिनमें रिकॉर्ड किए गए स्ट्रीम से वर्तमान टाइमस्टैम्प से कम या उसके बराबर टाइमस्टैम्प होता है और उस टाइमस्टैम्प के आधार पर कोई चैट संदेश दिखा/छुपा सकता है।
const replayChat = (currentTimestamp) => { Array.from(document.querySelectorAll('[data-timestamp]')).forEach(node => { const chatMsgTs = Number(node.getAttribute('data-timestamp')); const isVisible = chatMsgTs <= currentTimestamp; if (isVisible) { node.classList.remove('d-none'); } else { node.classList.add('d-none'); } }); const chatContainer = document.getElementById('chat'); chatContainer.scrollTop = chatContainer.scrollHeight; }