本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Kinesis Video Streams 疑難排解
使用下列資訊對 Amazon Kinesis Video Streams 遇到的常見問題進行疑難排解。
一般問題
本節說明使用 Kinesis Video Streams 時可能會遇到的一般問題。
問題
延遲過高
延遲可能是因為傳送至 Kinesis 影片串流服務的片段持續時間所造成。減少生產者和服務之間延遲的方法之一是,設定媒體管道以產生較短的片段持續期間。
若要減少每個片段中傳送的影格數,請在中減少下列值kinesis_video_gstreamer_sample_app.cpp
:
g_object_set(G_OBJECT (data.encoder), "bframes", 0, "key-int-max",
45
, "bitrate", 512, NULL);
注意
因為影片轉譯的內部實作,在 Mozilla Firefox 瀏覽器的延遲很嚴重。
API問題
本節說明使用 Kinesis Video Streams 時可能遇到的API問題。
問題
錯誤:「未知的選項」
GetMedia
和 GetMediaForFragmentList
可能會因為下列錯誤而失敗:
Unknown options: <filename>.mkv
如果您將 AWS CLI output
類型設定為,就會發生此錯誤json
。 AWS CLI 使用預設輸出類型 (none
) 重新配置。若要取得有關規劃的資訊 AWS CLI,請參閱《AWS CLI 指令參考》中的規劃。
錯誤:「無法判斷要授權的服務/操作名稱」
GetMedia
可能會因為下列錯誤而失敗:
Unable to determine service/operation name to be authorized
若未正確指定端點,可能會發生此錯誤。當您取得端點時,請務必在GetDataEndpoint
呼叫中包含下列參數,具體取決於API要呼叫的參數:
--api-name GET_MEDIA --api-name PUT_MEDIA --api-name GET_MEDIA_FOR_FRAGMENT_LIST --api-name LIST_FRAGMENTS
錯誤:「無法將影格放入串流」
PutMedia
可能會因為下列錯誤而失敗:
Failed to put a frame in the stream
若未將連線或權限提供給服務,可能會發生此錯誤。在中執行下列命令 AWS CLI,並確認串流資訊是否可擷取:
aws kinesisvideo describe-stream --stream-name
StreamName
--endpointhttps://ServiceEndpoint.kinesisvideo.region.amazonaws.com
如果呼叫失敗,請參閱疑難排解 AWS CLI 錯誤以取得詳細資訊。
錯誤:「在收到最終 AckEvent 服務之前已關閉連接」
PutMedia
可能會因為下列錯誤而失敗:
com.amazonaws.SdkClientException: Service closed connection before final AckEvent was received
如果 PushbackInputStream
未正確實作,可能會發生此錯誤。驗證unread()
方法是否正確實施。
錯誤:「STATUS_ _ STORE _ _ OUT _」MEMORY
PutMedia
可能會因為下列錯誤而失敗:
The content store is out of memory.
當內容存放區未分配足夠的大小時,將會發生此錯誤。若要提高內容存放區的大小,請提高 StorageInfo.storageSize
的值。如需詳細資訊,請參閱 StorageInfo。
HLS問題
如果您的視訊串流無法正確播放,請參閱疑難排解 HLS 問題。
爪哇問題
本節說明如何疑難排解使用 Kinesis Video Streams 時遇到的常見 Java 問題。
啟用 Java 日誌
若要疑難排解 Java 範例和程式庫的問題,啟用和檢查偵錯記錄檔會很有幫助。若要啟用偵錯日誌,請依下列步驟執行:
-
將
log4j
新增至pom.xml
檔案,在
dependencies
節點中:<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
在
target/classes
目錄中,建立名為log4j.properties
的檔案,內含下列內容:# Root logger option log4j.rootLogger=DEBUG, stdout # Redirect log messages to console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.logger.org.apache.http.wire=DEBUG
然後,調試日誌會打印到IDE控制台。
製作人庫問題
本節說明使用 Producer 資料庫 時可能遇到的問題。
問題
- 無法編譯生產者 SDK
- 影片串流不會顯示在主控台
- 使用GStreamer示範應用程式串流資料時發生錯誤:「要求中包含的安全性權杖無效」
- 錯誤:「無法將影格提交到 Kinesis Video 用戶端」
- GStreamer應用程序停止在 OS X 上顯示「流停止,未協商的原因」消息
- 錯誤:「無法分配堆」創建 Kinesis 視頻客戶端在GStreamer演示樹莓派
- 錯誤:在樹莓派上運行GStreamer演示時出現「非法指令」
- 攝影機無法載入 Raspberry Pi
- 在 macOS High Sierra 上找不到攝影機
- 在 macOS High Sierra 上編譯時找不到 jni.h 檔案
- 運行GStreamer演示應用程序時出現錯誤
- 在 Raspberry Pi 執行時間的時間戳記/範圍聲明
- 在 Raspberry Pi 上的 gst_value_set_fraction_range_full 聲明
- STATUS_ _ _ MKV _ _ INVALID _ _ ANNEXB _ _ NALU FRAME _ DATA (0x3200000d) 在安卓系統上出現錯誤
- 到達片段持續時間上限錯誤
- 使用 IoT 授權時的「傳遞的物件名稱無效」錯誤
無法編譯生產者 SDK
確認您的路徑中有所需的程式庫。若要確認,請使用下列命令:
env | grep LD_LIBRARY_PATH LD_LIBRARY_PATH=/home/local/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib
影片串流不會顯示在主控台
若要在主控台顯示您的視訊串流,必須使用 AvCC 格式中的 H.264 編碼。如果您的串流不會顯示,請確認以下資訊:
-
如果原始串流為 Annex-B 格式,您的 NAL 適應性旗標 已設定為
NAL_ADAPTATION_ANNEXB_NALS | NAL_ADAPTATION_ANNEXB_CPD_NALS
。這是StreamDefinition
建構函數中的預設值。 -
您提供正確的轉碼器私有資料。對於 H.264,這是序列參數集 (SPS) 和圖片參數組 (PPS)。根據您的媒體資料來源,此資料可能會從媒體來源單獨擷取或編碼到框架。
許多基礎串流為以下格式,其中的
Ab
是 Annex-B 起始碼 (001 或 0001):Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)…. Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)
CPD(編解碼器私人數據),如果 H.264 在流中 SPSPPS,則可以適應 AVCC 格式。除非媒體管道CPD單獨提供,否則應用程序可以通過查找第一個 Itr 框架(其中應包含SPS和PPS)CPD從框架中提取,然後將兩個NALUs(將是 Ab(Sps)Ab(Ps)))提取並將其設置在CPD中
StreamDefinition
。
使用GStreamer示範應用程式串流資料時發生錯誤:「要求中包含的安全性權杖無效」
如果發生此錯誤,表示您的登入資料有問題。請確認下列內容:
-
如果您使用臨時的登入資料,必須指定工作階段字符。
-
確認您的臨時登入資料並未過期。
-
確認您已設定適當的權利。
-
在 macOS 上,確認您沒有在鑰匙圈中快取登入資料。
錯誤:「無法將影格提交到 Kinesis Video 用戶端」
如果發生此錯誤,表示來源串流中的時間戳記未正確設定。請嘗試以下做法:
-
使用最新的SDK範例,其中可能有可修正您問題的更新。
-
將高質量流設置為更高的比特率,並在相機支持的情況下修復源流中的任何抖動。
GStreamer應用程序停止在 OS X 上顯示「流停止,未協商的原因」消息
串流可能會在 OS X 上停止並出現以下訊息:
Debugging information: gstbasesrc.c(2939): void gst_base_src_loop(GstPad *) (): /GstPipeline:test-pipeline/GstAutoVideoSrc:source/GstAVFVideoSrc:source-actual-src-avfvide: streaming stopped, reason not-negotiated (-4)
可能的解決方法是從gst_caps_new_simple
呼叫中移除影格速率參數kinesis_video_gstreamer_sample_app.cpp
:
GstCaps *h264_caps = gst_caps_new_simple("video/x-h264", "profile", G_TYPE_STRING, "baseline", "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", "width", GST_TYPE_INT_RANGE, 320, 1920, "height", GST_TYPE_INT_RANGE, 240, 1080,
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30, 1,
NULL);
錯誤:「無法分配堆」創建 Kinesis 視頻客戶端在GStreamer演示樹莓派
GStreamer範例應用程式會嘗試配置 512 MB 的RAM,這可能無法在您的系統上使用。您可以降低以下 KinesisVideoProducer.cpp
中的值以降低此配置:
device_info.storageInfo.storageSize =
512
* 1024 * 1024;
錯誤:在樹莓派上運行GStreamer演示時出現「非法指令」
如果您在執行GStreamer示範時遇到下列錯誤,請確認您已針對裝置的正確版本編譯應用程式。(例如, 確認你不編譯樹莓派 3 當你在樹莓派上運行 2。)
INFO - Initializing curl. Illegal instruction
攝影機無法載入 Raspberry Pi
若要檢查是否已載入攝影機,請執行下列動作:
ls /dev/video*
若未發現任何結果,請執行下列動作:
vcgencmd get_camera
輸出格式應類似以下內容:
supported=1 detected=1
如果驅動程式未偵測到攝影機,請執行下列動作:
-
檢查實體攝影機設定並確認正確連接。
-
執行以下動作以升級韌體:
sudo rpi-update
-
重新啟動裝置。
-
執行以下動作以載入驅動程式:
sudo modprobe bcm2835-v4l2
-
確認已偵測到攝影機:
ls /dev/video*
在 macOS High Sierra 上找不到攝影機
在 macOS High Sierra 上,示範應用程式找不到攝影機 (如果有多個攝影機)。
在 macOS High Sierra 上編譯時找不到 jni.h 檔案
若要解決這個錯誤,請將您安裝的 Xcode 更新到最新版本。
運行GStreamer演示應用程序時出現錯誤
若要解決執行GStreamer示範應用程式時的 curl 錯誤,請將此憑證檔案/etc/ssl/cert.pem
。
在 Raspberry Pi 執行時間的時間戳記/範圍聲明
如果在執行時間發生時間戳記聲明,請更新韌體並重新啟動裝置:
sudo rpi-update $ sudo reboot
在 Raspberry Pi 上的 gst_value_set_fraction_range_full 聲明
如果 uv4l
服務正在執行,將會顯示以下聲明:
gst_util_fraction_compare (numerator_start, denominator_start, numerator_end, denominator_end) < 0' failed
如果發生這種情況,請停止 uv4l
服務並重新啟動應用程式。
STATUS_ _ _ MKV _ _ INVALID _ _ ANNEXB _ _ NALU FRAME _ DATA (0x3200000d) 在安卓系統上出現錯誤
如果媒體串流的 NAL 適應性旗標 不正確,則會顯示以下錯誤:
putKinesisVideoFrame(): Failed to put a frame with status code 0x3200000d
如果發生此錯誤,請提供媒體的正確 .withNalAdaptationFlags
旗標 (例如,NAL_ADAPTATION_ANNEXB_CPD_NALS
)。在以下 Android Producer Library 一行中提供此旗標:
到達片段持續時間上限錯誤
此錯誤會在串流中的媒體片段超過片段持續時間上限時發生。請參閱本媒體和封存媒體 API 服務配額節中的最大片段持續時間限制。
請嘗試下列方法解決此問題:
-
如果您使用的是網路USB攝影機/相機,請執行下列其中一項操作:
-
如果您使用的是基於關鍵幀的碎片,請將編碼器設置為在 10 秒內提供關鍵幀。
-
如果您沒有使用以索引鍵影格為基礎的片段,則在中定義串流時步驟 2:編寫並檢查代碼,請將片段持續時間上限設定為小於 10 秒的值。
-
如果您在GStreamer管道中使用軟件編碼器(例如 x264),則可以在 10 秒內將 key-int-max 屬性設置為值。例如,設定 key-int-max 為 60,且 fps 設定為 30,則每 2 秒啟用一次關鍵影格。
-
-
如果您使用的是RPI攝影機,請將關鍵影格間隔屬性設定為少於 10 秒。
-
如果您使用的是 IP (RTSP) 攝影機,請將GOP大小設定為 60。
使用 IoT 授權時的「傳遞的物件名稱無效」錯誤
若要在使用 IoT 認證進行授權時避免此錯誤 (HTTP Error 403: Response: {"message":"Invalid thing name passed"}
),請確定的值 stream-name
(kvssink
元素的必要參數) 與的值相同iot-thingname
。如需詳細資訊,請參閱 元素參數參數。
流解析器庫問題
本節說明使用 串流剖析器程式庫 時可能遇到的問題。
無法從串流存取單一影格
若要從消費者應用程式中的串流來源存取單一畫面,請確認您的串流包含正確的轉碼器私人資料。如需有關串流資料格式的詳細資訊,請參閱 資料模型。
要了解如何使用編解碼器私人數據訪問框架,請參閱 GitHub 網站上的以下測試文件:KinesisVideoRendererExampleTest.
片段解碼錯誤
如果您的片段未以瀏覽器支援的 H.264 格式和層級正確地編碼,當您在主控台播放串流時,可能會看到以下錯誤:
Fragment Decoding Error There was an error decoding the video data. Verify that the stream contains valid H.264 content
如果發生這種情況,請檢查下列各項:
-
影格的解析度符合轉碼器私有資料中指定的解析度。
-
編碼影格的 H.264 設定檔和層級符合轉碼器私有資料中指定的設定檔和層級。
-
瀏覽器支援設定檔/層級組合。大多數目前的瀏覽器皆支援所有設定檔和層級組合。
-
時間戳記準確並且順序正確,並且未建立重複的時間戳記。
-
您的應用程式使用 H.264 格式編碼影格資料。
網路問題
如果您在嘗試連線到 Kinesis Video Streams 時看到連線錯誤,例如「連線逾時」或「連線失敗」,可能是因為網路設定中的 IP 位址範圍限制所致。
如果您的設定對 Kinesis Video Streams 有 IP 位址範圍限制,請更新您的網路組態以允許列出 Kinesis Video Streams IP 位
重要
IP 範圍清單並不是 Kinesis Video Streams IP 位址的完整清單。包括您看到的 IP 位址範圍,並注意 IP 位址可能會隨時間變更。
如需詳細資訊,請參閱 AWS IP 範圍。若要在 IP 範圍變更時收到通知,請遵循訂閱程序。