From 755ab6258b050a62aa7a6163c726edcdb124ebf7 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:26:45 +0000 Subject: [PATCH 01/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/general-issues.mdx | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 streaming-platform/troubleshooting/general-issues.mdx diff --git a/streaming-platform/troubleshooting/general-issues.mdx b/streaming-platform/troubleshooting/general-issues.mdx new file mode 100644 index 000000000..d27d7de31 --- /dev/null +++ b/streaming-platform/troubleshooting/general-issues.mdx @@ -0,0 +1,79 @@ +--- +title: "general-issues" +displayName: "General issues" +published: "true" +order: "10" +pageTitle: "Solving General Video Streaming Issues | Gcore" +pageDescription: "An explanation of common basic checks to address general issues that may arise when working with Video Streaming." +--- + +# General Video Streaming Issues + +Common issues you may encounter when working with both Live and VOD streams, as well as steps you can take to troubleshoot them. + + + If you encounter problems specific to live streaming or VOD uploads, please refer to the [Live streaming issues](https://gcore.com/docs/streaming-platform/live-streaming/troubleshooting/live-streaming-issues) or [VOD issues](https://gcore.com/docs/streaming-platform/live-streaming/troubleshooting/vod-issues) pages. + + +## General troubleshooting steps + +For the most common issues, such as video not playing, taking a long time to start streaming, or looking blurry, these basic checks should help: + +- **Status page**: Check if the issue you are experiencing is related to any known issue or is an isolated one by visiting the [status page](https://status.gcore.com). +- **Source video**: Ensure that the source content is uploaded for streaming. If the same issue occurs in the source, re-upload the video or restart the stream. +- **Stream URL and code**: Use the exact URL and embed code that appear in the Streaming settings. +- **Streaming settings**: Make sure the stream is enabled. If configured to pull a stream, ensure the source URL is correct. +- **Encoder settings**: Make sure you are using the recommended settings. If configured to push a stream, ensure the server URL and stream key are accurate. + +Other things to try: + +- Clear the browsing data. +- Disable any interfering browser extensions. +- Ensure that the network connection is stable. Try connecting with or without a VPN. +- Verify that the streaming ports are open on the firewall. +- Update the browser or device OS. + +## Common playback issues + +Various factors, including network issues, device compatibility, and encoding settings, can cause playback issues. Here are some common problems and their solutions. + +### Stream does not appear on some devices + +_Possible cause_: Device is too old.\ +_Suggested solution_: Streaming should work on most devices, but some may not be compatible. Try using a modern device with enough processing power and memory to stream video successfully. + +### Stream returns an HTTP 404 error + +_Possible cause_: Transcoding is in progress.\ +_Suggested solution_: Each video chunk may take several seconds to transcode. Allow 10 to 15 seconds for this to happen. Once the chunks have been transcoded, the stream should be ready to play. + +_Possible cause_: Low Latency is not enabled in the Customer Portal.\ +_Suggested solution_: Contact our [support team](mailto:support@gcore.com) to activate this option. + + + For more details on HTTP status codes, see the [HTTP status codes page](https://gcore.com/docs/streaming-platform/troubleshooting/http-status-codes). + + +### Stream returns an HTTP 502 error + +_Possible cause_: CDN resource settings have been changed from the preset settings.\ +_Suggested solution_: Contact our [support team](mailto:support@gcore.com) to assist you in restoring the settings. + +_Possible cause_: Token configuration is not synchronized.\ +_Suggested solution_: Contact our [support team](mailto:support@gcore.com) to help you restore the settings. + +## Open a support ticket + +If none of the above work or apply to your issue, contact our [support team](mailto:support@gcore.com) with the following information: + +1. Link to the stream. +2. Description of the issue and steps to reproduce. +3. List of steps taken to troubleshoot the issue. +4. Screenshot of the information shown in http://iam.gcdn.co/info. +5. Screenshot of the response to this command: + + ``` + curl http://iam.gcdn.co/info/json + ``` +6. Screenshot of the speed test result using http://iam.gcdn.co/info. +7. HAR file. [This page](https://toolbox.googleapps.com/apps/har_analyzer/?lang=en) describes how to generate one in Chrome, Firefox, and Edge. \ No newline at end of file From c2819867a0693f45a31c04c811daa7ec4dd5fe3a Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:39:10 +0000 Subject: [PATCH 02/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/http-status-codes.mdx | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 streaming-platform/troubleshooting/http-status-codes.mdx diff --git a/streaming-platform/troubleshooting/http-status-codes.mdx b/streaming-platform/troubleshooting/http-status-codes.mdx new file mode 100644 index 000000000..24b97f10c --- /dev/null +++ b/streaming-platform/troubleshooting/http-status-codes.mdx @@ -0,0 +1,32 @@ +--- +title: http-status-codes +displayName: HTTP status codes +published: true +order: 20 +pageTitle: Video Streaming HTTP Status Codes | Gcore +pageDescription: An explanation of the HTTP status codes returned when requesting videos and live streams for manifests or chunks. +--- + +# Video Streaming HTTP Status Codes + +The following table includes all possible HTTP status codes returned when requesting videos and live streams for manifests (e.g., .m3u8 and .mpd) or chunks (e.g., .ts, .mp4, etc.). + +| Code | Status | Description | +| ---- | ------ | ----------- | +| 200 | OK | All OK | +| 403 | Forbidden | Access is denied. If you use any distribution restriction, such as geo-restriction or token, you must satisfy this condition for access. | +| 404 | Not Found | +There is no video, or the live stream is temporarily not delivering chunks. Check the request link or activate your video.
For Live streams in CMAF format, you can check the extra header "X-Err-Code": | +| 422 | Unprocessable Content | This is advanced functionality (e.g., custom encoding presets). To enable it, contact your manager or the support team. | +| 500 | Internal Server Error | An unexpected issue happened on the server. This may be a local error in a specific video. In this case, check the video processing status in your account. If the error is global, the information will be on the status page. | +| 502 | Bad Gateway | An unexpected issue happened on the server. This may happen when VOD or Live can't be delivered over CDN because an incorrect response was received from an origin (storage or live transcoder). In this case, check the video processing status or live stream transcoding in your account. If the error is global, the information will appear on the status page. | +| 503 | Service Unavailable | An unexpected issue happened on the server. This may be a local error in a specific video. In this case, check the video processing status in your account. If the error is global, the information will be on the status page. | +| 504 | Gateway Time-out | Timeout for receiving data from the source. Try checking the status of video sending/ingesting and transcoding. | + + + + + +The system health status page is available at [https://status.gcore.com/](https://status.gcore.com/) + + \ No newline at end of file From fd75163676f5770930a0c8feeef616356c96b3da Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:42:55 +0000 Subject: [PATCH 03/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/live-streaming-issues.mdx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 streaming-platform/troubleshooting/live-streaming-issues.mdx diff --git a/streaming-platform/troubleshooting/live-streaming-issues.mdx b/streaming-platform/troubleshooting/live-streaming-issues.mdx new file mode 100644 index 000000000..2a7d3cbbd --- /dev/null +++ b/streaming-platform/troubleshooting/live-streaming-issues.mdx @@ -0,0 +1,30 @@ +--- +title: "live-streaming-issues" +displayName: "Live streaming issues" +published: "true" +order: "30" +pageTitle: "Solving Live Streaming Issues | Gcore" +pageDescription: "An explanation of common basic checks to address issues that may arise when working with Live Streaming." +--- + +# Live Streaming issues + +Here are some common issues you may encounter when working with Live Streaming and steps you can take to troubleshoot them. + +## Low-latency mode has a delay of more than 5 seconds + +_Possible cause_: The player does not support the DASH.JS library.\ +_Suggested solution_: Our low-latency solution has a 4-5-second latency. If the delay is more than 5 seconds: + +- Make sure that the player supports the DASH.JS library. +- Try testing your low-latency stream at the open-source [DASH.JS player](https://reference.dashif.org/dash.js). + +## Current broadcast contains DVR chunks of the previous broadcast + +_Possible cause_: The broadcast is over, but the stream has not been stopped.\ +_Suggested solution_: This is a normal behavior. + +To avoid this situation: + +- Stop the stream when the broadcast is finished. +- Delete the DVR archive before starting a new broadcast. \ No newline at end of file From 9a7ffc8a6398fdfa7a7539a96e7d4a28b2d0cc9c Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:45:48 +0000 Subject: [PATCH 04/29] Documentation edits made through Mintlify web editor --- streaming-platform/troubleshooting/general-issues.mdx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/streaming-platform/troubleshooting/general-issues.mdx b/streaming-platform/troubleshooting/general-issues.mdx index d27d7de31..95e56b9b5 100644 --- a/streaming-platform/troubleshooting/general-issues.mdx +++ b/streaming-platform/troubleshooting/general-issues.mdx @@ -1,12 +1,9 @@ --- -title: "general-issues" -displayName: "General issues" -published: "true" -order: "10" -pageTitle: "Solving General Video Streaming Issues | Gcore" -pageDescription: "An explanation of common basic checks to address general issues that may arise when working with Video Streaming." +title: General video streaming issues +sidebarTitle: General issues --- + # General Video Streaming Issues Common issues you may encounter when working with both Live and VOD streams, as well as steps you can take to troubleshoot them. From 7653caf0086e169440ed013489d80fbdd34e106e Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:46:39 +0000 Subject: [PATCH 05/29] Documentation edits made through Mintlify web editor --- streaming-platform/troubleshooting/http-status-codes.mdx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/streaming-platform/troubleshooting/http-status-codes.mdx b/streaming-platform/troubleshooting/http-status-codes.mdx index 24b97f10c..54b9a1cb2 100644 --- a/streaming-platform/troubleshooting/http-status-codes.mdx +++ b/streaming-platform/troubleshooting/http-status-codes.mdx @@ -1,10 +1,6 @@ --- -title: http-status-codes -displayName: HTTP status codes -published: true -order: 20 -pageTitle: Video Streaming HTTP Status Codes | Gcore -pageDescription: An explanation of the HTTP status codes returned when requesting videos and live streams for manifests or chunks. +title: Video streaming HTTP status codes +sidebarTitle: HTTP status codes --- # Video Streaming HTTP Status Codes From 136594bcabeac1dc3f3a286aa59b5920cfc85d6d Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:48:43 +0000 Subject: [PATCH 06/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/live-streaming-issues.mdx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/streaming-platform/troubleshooting/live-streaming-issues.mdx b/streaming-platform/troubleshooting/live-streaming-issues.mdx index 2a7d3cbbd..25ca03696 100644 --- a/streaming-platform/troubleshooting/live-streaming-issues.mdx +++ b/streaming-platform/troubleshooting/live-streaming-issues.mdx @@ -1,10 +1,6 @@ --- -title: "live-streaming-issues" -displayName: "Live streaming issues" -published: "true" -order: "30" -pageTitle: "Solving Live Streaming Issues | Gcore" -pageDescription: "An explanation of common basic checks to address issues that may arise when working with Live Streaming." +title: Live streaming issues +sidebarTitle: Live streaming issues --- # Live Streaming issues From cf9cee7532edffcca4ee49aa797af0ea17a41de9 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:55:04 +0000 Subject: [PATCH 07/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/live-streaming-issues.mdx | 38 +++++++++++-------- .../troubleshooting/vod-issues.mdx | 30 +++++++++++++++ 2 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 streaming-platform/troubleshooting/vod-issues.mdx diff --git a/streaming-platform/troubleshooting/live-streaming-issues.mdx b/streaming-platform/troubleshooting/live-streaming-issues.mdx index 25ca03696..df619c9d0 100644 --- a/streaming-platform/troubleshooting/live-streaming-issues.mdx +++ b/streaming-platform/troubleshooting/live-streaming-issues.mdx @@ -1,26 +1,34 @@ --- -title: Live streaming issues -sidebarTitle: Live streaming issues +title: vod-issues +displayName: VOD issues +published: true +order: 40 +pageTitle: Solving VOD Issues | Gcore +pageDescription: An explanation of common basic checks to address issues that may arise when working with VOD. --- -# Live Streaming issues +# VOD issues -Here are some common issues you may encounter when working with Live Streaming and steps you can take to troubleshoot them. +Common issues you may encounter when working with VOD, as well as steps you can take to troubleshoot them. -## Low-latency mode has a delay of more than 5 seconds +## Video is not uploaded -_Possible cause_: The player does not support the DASH.JS library.\ -_Suggested solution_: Our low-latency solution has a 4-5-second latency. If the delay is more than 5 seconds: +_Possible cause_: Upload has been interrupted by closing or reloading the window. +_Suggested solution_: Try uploading again and be careful not to interrupt the process. If the size of the video is more than 500 MB, the upload will resume where it left off. -- Make sure that the player supports the DASH.JS library. -- Try testing your low-latency stream at the open-source [DASH.JS player](https://reference.dashif.org/dash.js). +_Possible cause_: Not enough storage space to complete the upload. +_Suggested solution_: Confirm in the Storage statistics that you have used up your storage. Contact our [support team](mailto:support@gcore.com) to increase the storage space. -## Current broadcast contains DVR chunks of the previous broadcast +## Upload to the Gcore Customer Portal is interrupted by a session timeout (force logout) -_Possible cause_: The broadcast is over, but the stream has not been stopped.\ -_Suggested solution_: This is a normal behavior. +_Possible cause_: Video is too large to upload through UI. +_Suggested solution_: -To avoid this situation: +- Upload during late night or early morning hours when there is less load on the queue. +- Upload a small batch of videos (e.g., 10 at a time). +- Upload via API. -- Stop the stream when the broadcast is finished. -- Delete the DVR archive before starting a new broadcast. \ No newline at end of file +## Upload is stuck in the Processed state for a long time + +_Possible cause_: Processing queue is too long or loaded with large videos. +_Suggested solution_: Wait a while and then try uploading again. \ No newline at end of file diff --git a/streaming-platform/troubleshooting/vod-issues.mdx b/streaming-platform/troubleshooting/vod-issues.mdx new file mode 100644 index 000000000..a173f1d53 --- /dev/null +++ b/streaming-platform/troubleshooting/vod-issues.mdx @@ -0,0 +1,30 @@ +--- +title: "VOD issues" +sidebarTitle: "VOD issues" +--- + +# VOD issues + +Here are some common issues you may encounter when working with VOD and steps you can take to troubleshoot them. + +## Video is not uploaded + +_Possible cause_: Upload has been interrupted by closing or reloading the window.\ +_Suggested solution_: Try uploading again and be careful not to interrupt the process. If the video is more than 500 MB, the upload will resume where it left off. + +_Possible cause_: Not enough storage space to complete the upload.\ +_Suggested solution_: Confirm in the Storage statistics that you have used up your storage. Contact our [support team](mailto:support@gcore.com) to increase the storage space. + +## Upload to the Gcore Customer Portal is interrupted by a session timeout (force logout) + +_Possible cause_: Video is too large to upload through UI.\ +_Suggested solution_: + +- Upload during late night or early morning hours when there is less load on the queue. +- Upload a small batch of videos (e.g., 10 at a time). +- [Upload via API](https://gcore.com/docs/streaming-platform/video-hosting/upload-video-via-api). + +## Upload is stuck in the Processed state for a long time + +_Possible cause_: Processing queue is too long or loaded with large videos.\ +_Suggested solution_: Wait a while and then try uploading again. \ No newline at end of file From 9877a6b7c2f9588cfae500509fb32267dd407e4c Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:56:31 +0000 Subject: [PATCH 08/29] Documentation edits made through Mintlify web editor --- ...solve-common-streaming-platform-issues.mdx | 137 ------------------ 1 file changed, 137 deletions(-) delete mode 100644 streaming-platform/troubleshooting/solve-common-streaming-platform-issues.mdx diff --git a/streaming-platform/troubleshooting/solve-common-streaming-platform-issues.mdx b/streaming-platform/troubleshooting/solve-common-streaming-platform-issues.mdx deleted file mode 100644 index 7ac710613..000000000 --- a/streaming-platform/troubleshooting/solve-common-streaming-platform-issues.mdx +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Solve common video streaming issues -sidebarTitle: Streaming issues ---- - -We are covering some issues you may encounter when working with both Live and VOD streams, as well as steps you can take to troubleshoot them. - -## General troubleshooting steps - -For the most common issues, such as video not playing, taking a long time to start streaming, or looking blurry, these basic checks should help: - - * **Status page**. Check if the issue you are experiencing is related to any known issue or is an isolated one by visiting the [status page](https://status.gcore.com). - * **Source video**. Ensure that the source content is uploaded for streaming. If the same issue occurs in the source, re-upload the video or restart the stream. - * **Stream URL and code**. Make sure to use the exact URL and embed code that appear in the Streaming settings. - * **Streaming settings**. Make sure the stream is enabled. If configured to pull a stream, make sure the source URL is correct. - * **Encoder settings**. Make sure you are using the [recommended settings](/streaming-platform/live-streams-and-videos-protocols-and-codecs/what-initial-parameters-of-your-live-streams-and-videos-we-can-accept). If configured to push a stream, make sure the server URL and stream key are accurate. - - - -Other things to try: - - * Clear the browsing data. - * Disable any interfering browser extensions. - * Ensure that the network connection is stable. Try connecting with or without a VPN. - * Verify that the streaming ports are open on the firewall. - * Update the browser or device OS. - - - -## Other common issues and solutions - -### Playback - -**Stream does not appear on some devices** - -_Possible cause_ : Device is too old. -_Suggested solution_ : Streaming should work on most devices, but some devices may not be compatible. Try using a modern device with enough processing power and memory to successfully stream video. - -**Stream returns an HTTP 404 error** - -_Possible cause_ : Transcoding is in progress. -_Suggested solution_ : Each video chunk may take several seconds to transcode. Allow 10 to 15 seconds for this to happen. Once the chunks have been transcoded, the stream should be ready to play. - -_Possible cause_ : Low Latency is not enabled in the Customer Portal. -_Suggested solution_ : Contact our [support team](mailto:support@gcore.com) to activate this option. - -**Stream returns an HTTP 502 error** - -_Possible cause_ : CDN resource settings have been changed from the preset settings. -_Suggested solution_ : Contact our [support team](mailto:support@gcore.com) to assist you in restoring the settings. - -_Possible cause_ : Token configuration is not synchronized. -_Suggested solution_ : Contact our [support team](mailto:support@gcore.com) to help you restore the settings. - -**Current broadcast contains DVR chunks of the previous broadcast** - -_Possible cause_ : The broadcast is over, but the stream has not been stopped. -_Suggested solution_ : This is a normal behavior. - -To avoid this situation: - - * Stop the stream when the broadcast is finished. - * Delete the DVR archive before starting a new broadcast. - - - -**Low latency mode has a delay of more than 5 seconds** - -_Possible cause_ : The player does not support the DASH.JS library. -_Suggested solution_ : Our low latency solution has a latency of 4-5 seconds. If the delay is more than 5 seconds: - - * Make sure that the player supports the DASH.JS library. - * Try testing your low latency stream at the open source [DASH.JS player](https://reference.dashif.org/dash.js). - - - -### Upload - -**Video is not uploaded** - -_Possible cause_ : Upload has been interrupted by closing or reloading the window. -_Suggested solution_ : Try uploading again and be careful not to interrupt the process. If the size of the video is more than 500 MB, the upload will resume where it left off. - -_Possible cause_ : Not enough storage space to complete the upload. -_Suggested solution_ : Confirm in the Storage statistics that you have used up your storage. Contact our [support team](mailto:support@gcore.com) to increase the storage space. - -**Upload to the Gcore Customer Portal is interrupted by a session timeout (force logout)** - -_Possible cause_ : Video is too large to upload through UI. -_Suggested solution_ : - - * Upload during late night or early morning hours when there is less load on the queue. - * Upload a small batch of videos (e.g., 10 at a time). - * [Upload via API](/streaming-platform/video-hosting/upload-video-via-api). - - - -**Upload is stuck in the Processed state for a long time** - -_Possible cause_ : Processing queue is too long or loaded with large videos. -_Suggested solution_ : Wait a while and then try uploading again. - -### Player - -**No sound when using Gcore player** - -_Possible cause_ : The audio is encoded with an unsupported codec. -_Suggested solution_ : Set the audio codec to AAC. Note that if you are using Adobe FMLE on Windows, you need to purchase an AAC encoder plugin in order to use the AAC audio format. - -**Selected Gcore player does not render on the page** - -_Possible cause_ : Some parameters have been added to the URL in the embed code. -_Suggested solution_ : Contact our [support team](mailto:support@gcore.com) to troubleshoot the issue further. - -**No playback controls on the Gcore player** - -_Possible cause_ : Disable Skin is active. -_Suggested solution_ : Turn this option off. - -## Open a support ticket - -If none of the above work or apply to your issue, contact our [support team](mailto:support@gcore.com) with the following information: - - 1. Link to the stream. - 2. Description of the issue and steps to reproduce. - 3. List of steps taken to troubleshoot the issue. - 4. Screenshot of the information shown in http://iam.gcdn.co/info. - 5. Screenshot of the response to this command: - - - -```sh -curl http://iam.gcdn.co/info/json - ``` - - 6. Screenshot of the speed test result using http://iam.gcdn.co/info. - 7. HAR file. This [page](https://toolbox.googleapps.com/apps/har_analyzer/?lang=en) describes how to generate one in Chrome, Firefox, and Edge. \ No newline at end of file From a79c5ae7940c0f770d4ab2af7625e5897e84a337 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 10:58:42 +0000 Subject: [PATCH 09/29] Documentation edits made through Mintlify web editor --- ...nscoding-bitrate-frame-rate-and-codecs.mdx | 171 ++++++++---------- 1 file changed, 75 insertions(+), 96 deletions(-) diff --git a/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs.mdx b/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs.mdx index 25935dbdb..9a3abe346 100644 --- a/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs.mdx +++ b/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs.mdx @@ -1,97 +1,76 @@ ---- -title: "Output parameters after transcoding: bitrate, frame rate, and codecs" -sidebarTitle: Output parameters ---- - -## What is transcoding with ABR? - -In a nutshell, transcoding is converting the original video from one format to another format with a set of extra qualities (ABR). Transcoding aims to make videos viewable across different platforms and devices and to expand the number of viewers, e.g., adding those who couldn't watch the video in its original format. Learn more about transcoding with our [in-depth article](https://gcore.com/learning/what-is-transcoding/). - -Transcoding with adaptive bitrate streaming (ABR) works like this: - - 1. Decoding of the original video ([list of accepted parameters](/streaming-platform/live-streams-and-videos-protocols-and-codecs/what-initial-parameters-of-your-live-streams-and-videos-we-can-accept) for input video) - 2. Processing, including scaling (resizing,) frame rate conversion, aspect ratio conversion, and other types of video processing - 3. Encoding into the desired output format - - - -Discover how we [lowered the bitrate](https://gcore.com/blog/how-we-lowered-the-bitrate-for-live-and-vod-streaming-by-32-5-without-sacrificing-quality/) for live and VOD streaming by 32.5% without sacrificing quality. - -## Audio and video codecs - -A transcoded video stream has the following codecs by default: - - * **Audio** : AAC, 44.1KHz, stereo - * **Video** : H264, 30FPS, ABR - - - -## Output parameters after transcoding - -The table below shows the available output quality levels after transcoding. Video and audio parameters are optimized for adaptive bitrate streaming, providing smooth playback across devices and network conditions. - -**Video Quality** | **Resolution** | **FPS** | **Video bitrate, Mbps** | **Audio bitrate, Mbps** ----|---|---|---|--- -UHD 8K* | 7680 × 4320 | - | - | - -UHD 4K* | 3840 × 2160 | 30 | 14,000 | 0,196 -QHD 2K* | 2560 × 1440 | 30 | 7,200 | 0,196 -Full HD 1080p | 1920 × 1080 | 30 | 4,050 | 0,128 -HD 720p | 1280 × 720 | 30 | 1,800 | 0,128 -SD 468p | 832 × 468 | 30 | 0,800 | 0,096 -360p | 640 × 360 | 30 | 0,450 | 0,064 -240p* | 427 × 240 | 30 | 0,200 | 0,064 -144p* | 254 × 144 | 30 | 0,072 | 0,064 -Audio only* | - | - | - | 0,128 - -*To enable these qualities, contact the [support team](mailto:support@gcore.com). - -The values in the table are given for videos with a horizontal aspect ratio of 16:9. The values must be reversed for vertical videos. For example, if a horizontal resolution is (1280 × 720), the relevant vertical resolution is (720 × 1280). - -We use variable bitrate (VBR) for encoding video. The table above shows average values. The Gcore Customer Portal shows a sum of audio and video bitrates. - -**Note** : We don't upscale videos. Your output will range from the lowest quality to that of your original bitrate. So, if you upload a 4K video, your output will range from the lowest quality up to 4K. Similarly, if you upload a 720p video, your output will vary from the lowest quality up to 720p only. - -### Custom quality sets - -We provide an optimized set of quality presets designed for smooth streaming across all devices. These settings balance quality and bandwidth efficiency, making them ideal for most users. However, if you have specific requirements—such as higher audio quality, cost reduction by removing unnecessary renditions, AV1 encoding, or custom settings for individual videos—you have full control over your transcoding presets. - -Each video can have its own unique quality settings, so you're not limited to a single configuration. Default and custom presets work together, giving you the flexibility to fine-tune streaming quality as needed. Check out the [API documentation](https://api.gcore.com/docs/streaming#tag/QualitySets) to explore available custom quality sets. If you need assistance, our [support team](mailto:support@gcore.com) is always ready to help you customize the best option for your needs. - -## HTTP response codes when requesting Live and VOD videos - -The following table includes the possible HTTP response codes returned when requesting videos and live streams for manifests (.m3u8, .mpd) and chunks (.ts, mp4, etc.). - -| Code | Function | Description | -|------|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 200 | OK | All OK | -| 403 | Forbidden | Access is denied. If you use any distribution restriction such as geo-restriction or token, you must satisfy this condition for access. | -| 404 | Not Found | There's no requested video, or the live stream is temporarily not delivering chunks. Check the request link or activate your video.
For Live streams in CMAF format, you can check the extra header "X-Err-Code": | -| 422 | Not Found | This is advanced functionality (i.e. custom encoding presets). To enable it, contact your manager or the support team. | -| 500 | Internal Server Error | An unexpected issue happened on the server. This may be a local error in a specific video. In this case, check the video processing status in your personal account. If the error is global, the information will be on the status page. | -| 502 | Bad Gateway | An unexpected issue happened on the server. This may happen when VOD or Live can't be delivered over CDN because an incorrect response was received from an origin (storage or live transcoder). In this case, check the video processing status or live stream transcoding in your personal account. If the error is global, the information will appear on the status page. | -| 503 | Service Unavailable | An unexpected issue happened on the server. This may be a local error in a specific video. In this case, check the video processing status in your personal account. If the error is global, the information will be on the status page. | -| 504 | Gateway Time-out | Timeout for receiving data from the source. Try checking the status of video sending/ingesting and transcoding. | - - -**Info** - -The system health status page is available at https://status.gcore.com/ - - -## How to apply 2K/4K+ and custom advanced settings - -Some settings require manual control. If you need them, contact the Gcore [support team](mailto:support@gcore.com) or your manager. - -The basic tariff plan doesn't include 2K/4K+ in the transcoding quality preset. For information about high-quality video processing costs, check our [pricing page](https://gcore.com/pricing/streaming-platform). To work with high-quality video, we'll provide you with new quality presets and a new tariff plan. - -Additionally, you can ask to activate the following settings: - - * Use codecs H265 HEVC, VP9, AV1, etc., - * Add 8K quality, - * Add super-low quality 144p, - * Change preset of output ABR qualities for all or some renditions, remove low-quality renditions, - * Use 60+ FPS or use original FPS values, - * Increase bitrate for audio; use 48KHz, - * Use Dolby Digital, Dolby Atmos, - * Transmux VOD MP4 files into HLS on the fly. +--- +title: "Output parameters after transcoding: bitrate, frame rate, and codecs" +sidebarTitle: Output parameters +--- + +## What is transcoding with ABR? + +In a nutshell, transcoding is converting the original video from one format to another format with a set of extra qualities (ABR). Transcoding aims to make videos viewable across different platforms and devices and to expand the number of viewers, e.g., adding those who couldn't watch the video in its original format. Learn more about transcoding with our [in-depth article](https://gcore.com/learning/what-is-transcoding/). + +Transcoding with adaptive bitrate streaming (ABR) works like this: + + 1. Decoding of the original video ([list of accepted parameters](/streaming-platform/live-streams-and-videos-protocols-and-codecs/what-initial-parameters-of-your-live-streams-and-videos-we-can-accept) for input video) + 2. Processing, including scaling (resizing,) frame rate conversion, aspect ratio conversion, and other types of video processing + 3. Encoding into the desired output format + + + +Discover how we [lowered the bitrate](https://gcore.com/blog/how-we-lowered-the-bitrate-for-live-and-vod-streaming-by-32-5-without-sacrificing-quality/) for live and VOD streaming by 32.5% without sacrificing quality. + +## Audio and video codecs + +A transcoded video stream has the following codecs by default: + + * **Audio** : AAC, 44.1KHz, stereo + * **Video** : H264, 30FPS, ABR + + + +## Output parameters after transcoding + +The table below shows the available output quality levels after transcoding. Video and audio parameters are optimized for adaptive bitrate streaming, providing smooth playback across devices and network conditions. + +**Video Quality** | **Resolution** | **FPS** | **Video bitrate, Mbps** | **Audio bitrate, Mbps** +---|---|---|---|--- +UHD 8K* | 7680 × 4320 | - | - | - +UHD 4K* | 3840 × 2160 | 30 | 14,000 | 0,196 +QHD 2K* | 2560 × 1440 | 30 | 7,200 | 0,196 +Full HD 1080p | 1920 × 1080 | 30 | 4,050 | 0,128 +HD 720p | 1280 × 720 | 30 | 1,800 | 0,128 +SD 468p | 832 × 468 | 30 | 0,800 | 0,096 +360p | 640 × 360 | 30 | 0,450 | 0,064 +240p* | 427 × 240 | 30 | 0,200 | 0,064 +144p* | 254 × 144 | 30 | 0,072 | 0,064 +Audio only* | - | - | - | 0,128 + +*To enable these qualities, contact the [support team](mailto:support@gcore.com). + +The values in the table are given for videos with a horizontal aspect ratio of 16:9. The values must be reversed for vertical videos. For example, if a horizontal resolution is (1280 × 720), the relevant vertical resolution is (720 × 1280). + +We use variable bitrate (VBR) for encoding video. The table above shows average values. The Gcore Customer Portal shows a sum of audio and video bitrates. + +**Note** : We don't upscale videos. Your output will range from the lowest quality to that of your original bitrate. So, if you upload a 4K video, your output will range from the lowest quality up to 4K. Similarly, if you upload a 720p video, your output will vary from the lowest quality up to 720p only. + +### Custom quality sets + +We provide an optimized set of quality presets designed for smooth streaming across all devices. These settings balance quality and bandwidth efficiency, making them ideal for most users. However, if you have specific requirements—such as higher audio quality, cost reduction by removing unnecessary renditions, AV1 encoding, or custom settings for individual videos—you have full control over your transcoding presets. + +Each video can have its own unique quality settings, so you're not limited to a single configuration. Default and custom presets work together, giving you the flexibility to fine-tune streaming quality as needed. Check out the [API documentation](https://api.gcore.com/docs/streaming#tag/QualitySets) to explore available custom quality sets. If you need assistance, our [support team](mailto:support@gcore.com) is always ready to help you customize the best option for your needs. + +## How to apply 2K/4K+ and custom advanced settings + +Some settings require manual control. If you need them, contact the Gcore [support team](mailto:support@gcore.com) or your manager. + +The basic tariff plan doesn't include 2K/4K+ in the transcoding quality preset. For information about high-quality video processing costs, check our [pricing page](https://gcore.com/pricing/streaming-platform). To work with high-quality video, we'll provide you with new quality presets and a new tariff plan. + +Additionally, you can ask to activate the following settings: + + * Use codecs H265 HEVC, VP9, AV1, etc., + * Add 8K quality, + * Add super-low quality 144p, + * Change preset of output ABR qualities for all or some renditions, remove low-quality renditions, + * Use 60+ FPS or use original FPS values, + * Increase bitrate for audio; use 48KHz, + * Use Dolby Digital, Dolby Atmos, + * Transmux VOD MP4 files into HLS on the fly. * Transmux and "pass-through" instead of transcoding for LIVE streams. \ No newline at end of file From 3b705bafd80837eefa9ef66ce27431e40046e2c9 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 11:03:56 +0000 Subject: [PATCH 10/29] Documentation edits made through Mintlify web editor --- .../broadcasting-software/ffmpeg.mdx | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx diff --git a/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx b/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx new file mode 100644 index 000000000..641fac377 --- /dev/null +++ b/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx @@ -0,0 +1,70 @@ +--- +title: "FFmpeg" +sidebarTitle: "FFmpeg" +--- + +# FFmpeg + +FFmpeg is a free and open-source command-line tool for recording, screencasting, and live streaming. It’s suitable for video game streaming, blogging, educational content, and more. + +FFmpeg links your device (e.g, a laptop or a PC) to different streaming platforms (e.g., Gcore Video Streaming, YouTube, Twitch, etc.). It takes an image captured by a camera, converts it into a video stream, and then sends it to the streaming platform. + +## Setup + +1. Install FFmpeg on your device. Follow the download instructions on [the official website](https://ffmpeg.org/download.html). + +2. To get the server URL and stream key, go to the [Streaming list](https://streaming.gcore.com/streaming/list), open the **Live stream settings** you need, and copy the relevant value from the **URLs for the encoder** section. + +For example, if you see these values on the **Live stream settings** page: + +![Live stream settings](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/11774973436177.png) + +Concatenate them to form the full RTMP URL for the stream: + +``` +rtmp://vp-push-ix1.gvideo.co/in/400448?cdf2a7ccf990e464c2b… +``` + +3. Open the command line interface (CLI) on your device and run the following command: + +``` +ffmpeg -f {input format params} -f flv {RTMP URL} +``` + +## Configure the stream parameters for optimal performance + +We recommend configuring the stream parameters you will send to our server to ensure optimal streaming performance. You can adjust these settings via the CLI parameters of FFmpeg. + +Example of a command line for streaming via FFmpeg with the recommended parameters: + +``` +ffmpeg -f {input format params} \ + -c:v libx264 -preset veryfast -b:v 2000000 \ + -profile:v baseline -vf format=yuv420p \ + -crf 23 -g 60 \ + -b:a 128k -ar 44100 -ac 2 \ + -f flv {RTMP URL} +``` + +### Output parameters + +- **Video Bitrate:** To stream at 720p resolution, set the bitrate to 2000Kbps (`-b:v 2000000`). If you’re broadcasting at 1080p, set the bitrate to 4000Kbps (`-b:v 4000000`). +- **Audio Bitrate:** 128 (`-b:a 128k`). +- **Encoder:** Software (`-c:v libx264`), or any other H264 codec. +- **Rate control:** CRF (`-crf 23`) +- **Keyframe Interval:** 2s (`-g 60`). +- **CPU Usage Preset:** veryfast (`-preset veryfast`). +- **Profile:** baseline (`-profile:v baseline -vf format=yuv420p`) + +### Audio parameters + +- **Sample Rate**: 44.1 kHz (`-ar 44100`) or 48 kHz (`-ar 48000`). +- Use **Stereo** for the best sound quality (`-ac 2`). + +### Video parameters + +If you need to reduce the original resolution (downscale), follow the instructions in this section. If no resolution change is required, you can skip this step. + +- **Output (Scaled) Resolution:** 1280×720 +- **Downscale Filter:** Bicubic +- **Common FPS Values:** 30 \ No newline at end of file From 74d2aa044fa514ad9320d731eca2c1ddc73af0a9 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 11:32:30 +0000 Subject: [PATCH 11/29] Documentation edits made through Mintlify web editor --- images/larix-grove.png | Bin 0 -> 79504 bytes .../broadcasting-software/larix.mdx | 66 ++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 images/larix-grove.png create mode 100644 streaming-platform/live-streaming/broadcasting-software/larix.mdx diff --git a/images/larix-grove.png b/images/larix-grove.png new file mode 100644 index 0000000000000000000000000000000000000000..84e1dd76761d93507ba4c7581f224be9fa572c48 GIT binary patch literal 79504 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 Date: Wed, 7 May 2025 13:05:37 +0000 Subject: [PATCH 12/29] Documentation edits made through Mintlify web editor --- .../broadcasting-software/obs.mdx | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 streaming-platform/live-streaming/broadcasting-software/obs.mdx diff --git a/streaming-platform/live-streaming/broadcasting-software/obs.mdx b/streaming-platform/live-streaming/broadcasting-software/obs.mdx new file mode 100644 index 000000000..1be600be0 --- /dev/null +++ b/streaming-platform/live-streaming/broadcasting-software/obs.mdx @@ -0,0 +1,102 @@ +--- +title: "Open Broadcaster Software" +sidebarTitle: "OBS" +--- + +# Open Broadcaster Software + +Open Broadcaster Software (OBS) is a free and open-source encoder for video recording, screencasting, and live streaming. It’s suitable for video game streaming, blogging, educational content, and more. + +OBS links your device (a laptop or a PC) to different streaming platforms (Gcore Video Streaming, YouTube, Twitch, etc.). It takes a camera image, converts it into a video stream, and then sends it to the streaming platform. + +## Setup + +1. Download Open Broadcaster Software (OBS) from the [official website](https://obsproject.com). + +2. Open the **Settings** section and go to the **Stream** tab. Complete the remaining steps in it. + +![Stream tab](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807190142097.png) + +3. Select **Custom** from the dropdown list. + +4. Enter the Server URL into the **Server** field and the unique key into the **Stream Key** field. To get the Server URL and key, go to the [Streaming list](https://streaming.gcore.com/streaming/list), open the Live stream settings you need, and copy the relevant value from the URLs for the encoder section. + +For example, if you see these values on the Live stream settings page: + +![Live stream settings](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/11774973436177.png) + +Paste them into the OBS Settings as follows: + +- _rtmp://vp-push-ix1.gvideo.co/in/_ is the **Server**. +- _400448?cdf2a7ccf990e464c2b…_ is the **Stream Key**. + +5. Click the **Apply** button to save the new configuration. + +6. Go to the **main OBS menu**, select the stream's source (video capture device, display capture, etc.), and click **Start Streaming**. + +![Start Streaming](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807465490193.png) + +7. Once the streaming has started, go to the [Streaming list](https://streaming.gcore.com/streaming/list), open the **Live Stream settings**, and copy the link to embed the broadcast to your website. + +![Streaming list](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/11775007043985.png) + +That’s it. The stream from OBS will be broadcast to your website. + +## Configure the stream parameters for optimal performance + +We recommend configuring the stream parameters you will send to our server to ensure optimal streaming performance. You can adjust these settings in the OBS Output, Audio, and Video tabs. + +### Output parameters + +1. Open OBS Settings and go to the **Output** tab. Select **Simple** mode. + +2. Set the parameters as follows: + +- **Video Bitrate:** The resolution of your stream determines the required bitrate: The higher the resolution, the higher the bitrate. To stream at 720p resolution, set the bitrate to 2000Kbps. If you’re broadcasting at 1080p, set the bitrate to 4000Kbps. +- **Audio Bitrate:** 128. +- **Encoder:** Software (x264), or any other H264 codec. + +![Manage the stream parameters](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807571524241.png) + +3. Click **Advanced** mode. + +4. Set the parameters as follows: + +- **Rate control:** CRF (the default value is 23) +- **Keyframe Interval (0=auto):** 2s +- **CPU Usage Preset:** veryfast +- **Profile:** baseline + +5. Click **Apply** to save the configuration. + +![configuration](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807656645393.png) + +### Audio parameters + +![Audio parameters](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807660371473.png) + +1. Open OBS Settings and go to the Audio tab. + +2. Set the Sample Rate to 44.1 kHz (default) or 48 kHz. Select **Stereo** for the best sound quality. + +3. Click **Apply**. + +### Video parameters + +If you need to reduce the original resolution (downscale), follow the instructions in this section. If no resolution change is required, you can skip this step. + +1. Open OBS Settings and go to the **Video** tab. + +2. Set the following parameters: + +- **Output (Scaled) Resolution:** 1280×720 +- **Downscale Filter:** Bicubic +- **Common FPS Values:** 30 + +3. Click **Apply**. + +![Video parameters Apply](https://assets.gcore.pro/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807613445521.png) + + + You can see the stream's [output parameters here](https://gcore.com/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs#output-parameters). If you need to increase the FPS to 60, make sure to also increase the bitrate accordingly for optimal stream quality. + \ No newline at end of file From 77a559f6a2ca9eb11a7320165da915e7d3da2f7e Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 13:13:08 +0000 Subject: [PATCH 13/29] Documentation edits made through Mintlify web editor --- .../live-streaming/protocols/rtmp.mdx | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 streaming-platform/live-streaming/protocols/rtmp.mdx diff --git a/streaming-platform/live-streaming/protocols/rtmp.mdx b/streaming-platform/live-streaming/protocols/rtmp.mdx new file mode 100644 index 000000000..6107c8925 --- /dev/null +++ b/streaming-platform/live-streaming/protocols/rtmp.mdx @@ -0,0 +1,113 @@ +--- +title: "The Real Time Messaging Protocol" +sidebarTitle: "RTMP" +--- + +# The Real Time Messaging Protocol + +The Real Time Messaging Protocol (RTMP) is the most common way to stream to video streaming platforms. Gcore Live Streaming supports both RTMP and RTMPS. + + + RTMP is limited to the H264 codec only. If you want to use other codecs, please [use SRT](https://gcore.com/docs/streaming-platform/live-streaming/protocols/srt) instead. + + We plan to support H265/HVEC and other extensions from the Enhanced RTMP specification. Stay tuned for updates. + + +## Push streams + +Gcore Video Streaming provides two endpoints for pushing a stream: the default one and a backup one. The default endpoint is the one closest to your location. The backup endpoint is in a different location and is used if the default one is unavailable. + +By default, Gcore will route your stream to free ingest points with the lowest latency. If you need to set a fixed ingest point or if you need to set the main and backup ingest points in the same region (i.e., to not send streams outside the EU or US), please contact our support team. + +### Obtain the server URLs and stream key + +There are two ways to obtain the server URLs and stream key: via the Gcore Customer Portal or via the API. + +#### Via the Gcore Customer Portal + +1. In the **Gcore Customer Portal**, navigate to **Streaming** \> [**Live Streaming**](https://portal.gcore.com/streaming/streaming/list). + +![List of live streams](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-list.png) + +2. Click on the stream you want to push to. This will open the **Live Stream Settings**. + +![Live stream settings](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-settings.png) + +3. Ensure that the **Ingest type** is set to **Push**. +4. Ensure that the protocol is set to **RTMP** or **RTMPS** in the **URLs for encoder** section. 5. Copy the **Server** URL and **Stream Key** from the **URLs for encoder** section. + +![URLs for encoder section](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/urls-for-encoder.png) + +#### Via the API + +You can also obtain the URL and stream key via the Gcore API. The endpoint returns the complete URLs for the default and backup ingest points and the stream key. + +Example of the API request: + +```http +GET /streaming/streams/{stream_id} +``` + +Example of the API response: + +```json +{ + "push_url": "rtmp://vp-push-anx2.domain.com/in/123?08cd54f0", + "backup_push_url": "rtmp://vp-push-ed1.domain.com/in/123b?08cd54f0", + ... +} +``` + +Read more in [the API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/post_streams_id). + +## Pull streams + +Gcore Video Streaming can pull video data from your external server. + +Main rules of pulling: + +- The URL of the stream to pull from must be **publicly available** and **return a 200 status** for all requests. +- You can specify **multiple media servers** (separated with space characters) in the **URL** input field. The maximum length of all URLs is 255 characters and the round robin is used when polling the list of specified servers. +- If a stream is closed (i.e., its connection is terminated) or there is no video data in the stream for 30 seconds, then the next attempt will be made in the next steps progressively (10s, 30s, 60s, 5min, 10min). +- The stream will be deactivated after 24 hours of inactivity. +- If you need to set an allowlist for access to the stream, please contact support to get an up-to-date list of networks. + +### Setting up a pull stream + +There are two ways to set up a pull stream: via the Gcore Customer Portal or via the API. + +#### Via the Gcore Customer Portal + +1. In the **Gcore Customer Portal**, navigate to **Streaming** \> [**Live Streaming**](https://portal.gcore.com/streaming/streaming/list). + +![List of live streams](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-list.png) + +2. Click on the stream you want to pull from. This will open the **Live Stream Settings**. + +![Live stream settings](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-settings.png) + +3. Ensure that the **Ingest type** is set to **Pull**. +4. In the **URL** field, insert a link to the stream from your media server. +5. Click the **Save changes** button on the top right. + +#### Via the API + +You can also set up a pull stream via the Gcore API. The endpoint accepts the URL of the stream to pull from. + +Example of the API request: + +```http +PATCH /streaming/streams/{stream_id} +``` + +```json +{ + "stream": { + "pull": true, + "uri": "rtmp://example.com/path/to/stream", + ... + } +} +``` + +Read more in [the API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/patch_streams_id). \ No newline at end of file From b3d8ee49a2141fe54a515c4fcbccfaca51abe198 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 13:20:03 +0000 Subject: [PATCH 14/29] Documentation edits made through Mintlify web editor --- .../live-streaming/protocols/srt.mdx | 110 ++ .../webrtc.mdx} | 1024 ++++++++--------- .../push-live-streams-via-liveu-solo.mdx | 19 - .../push-live-streams-via-obs.mdx | 130 --- 4 files changed, 622 insertions(+), 661 deletions(-) create mode 100644 streaming-platform/live-streaming/protocols/srt.mdx rename streaming-platform/live-streaming/{webrtc-to-hls-transcoding.mdx => protocols/webrtc.mdx} (98%) delete mode 100644 streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-liveu-solo.mdx delete mode 100644 streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs.mdx diff --git a/streaming-platform/live-streaming/protocols/srt.mdx b/streaming-platform/live-streaming/protocols/srt.mdx new file mode 100644 index 000000000..04ed97d5b --- /dev/null +++ b/streaming-platform/live-streaming/protocols/srt.mdx @@ -0,0 +1,110 @@ +--- +title: "The Secure Reliable Transport Protocol" +sidebarTitle: "SRT" +--- + +# The Secure Reliable Transport Protocol + +Secure Reliable Transport (SRT) is an open-source streaming protocol that solves some of the limitations of RTMP delivery. In contrast to RTMP/RTMPS, SRT is a UDP-based protocol that provides low-latency streaming over unpredictable networks. On Gcore Video Streaming, SRT is also required if you want to use the H265/HVEC codec. + +## Push streams + +Gcore Video Streaming provides two endpoints for pushing a stream: the default one and a backup one. The default endpoint is the one closest to your location. The backup endpoint is in a different location and is used if the default one is unavailable. + +By default, Gcore will route your stream to free ingest points with the lowest latency. If you need to set a fixed ingest point or if you need to set the main and backup ingest points in the same region (i.e., to not send streams outside the EU or US), please contact our support team. + +### Obtain the server URLs + +There are two ways to obtain the SRT server URLs: via the Gcore Customer Portal or via the API. + +#### Via the Gcore Customer Portal + +1. In the **Gcore Customer Portal**, navigate to **Streaming** \> [**Live Streaming**](https://portal.gcore.com/streaming/streaming/list). + +![List of live streams](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-list.png) + +2. Click on the stream you want to push to. This will open the **Live Stream Settings**. + +![Live stream settings](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-settings.png) + +3. Ensure that the **Ingest type** is set to **Push**. +4. Ensure that the protocol is set to **SRT** in the **URLs for encoder** section. +5. Copy the server URL from the **Push URL SRT** field. + +![URLs for encoder section](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/urls-for-encoder.png) + +#### Via the API + +You can also obtain the URL and stream key via the Gcore API. The endpoint returns the complete URLs for the default and backup ingest points, as well as the stream key. + +Example of the API request: + +```http +GET /streaming/streams/{stream_id} +``` + +Example of the API response: + +```json +{ + "push_url": "srt://vp-push-anx2.domain.com/in/123?08cd54f0", + "backup_push_url": "srt://vp-push-ed1.domain.com/in/123b?08cd54f0", + ... +} +``` + +Read more in [the API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/post_streams_id). + +## Pull streams + +Gcore Video Streaming can pull video data from your external server. + +Main rules of pulling: + +- The URL of the stream to pull from must be **publicly available** and **return a 200 status** for all requests. +- You can specify **multiple media servers** (separated with space characters) in the **URL** input field. The maximum length of all URLs is 255 characters and the round robin is used when polling the list of specified servers. +- If a stream is closed (i.e., its connection is terminated) or there is no video data in the stream for 30 seconds, then the next attempt will be made in the next steps progressively (10s, 30s, 60s, 5min, 10min). +- The stream will be deactivated after 24 hours of inactivity. +- If you need to set an allowlist for access to the stream, please contact support to get an up-to-date list of networks. + +### Setting up a pull stream + +There are two ways to set up a pull stream: via the Gcore Customer Portal or via the API. + +#### Via the Gcore Customer Portal + +1. In the **Gcore Customer Portal**, navigate to **Streaming** \> [**Live Streaming**](https://portal.gcore.com/streaming/streaming/list). + +![List of live streams](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-list.png) + +2. Click on the stream you want to pull from. This will open the **Live Stream Settings**. + +![Live stream settings](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-settings.png) + +3. Ensure that the **Ingest type** is set to **Pull**. +4. In the **URL** field, insert a link to the stream from your media server. +5. Click the **Save changes** button on the top right. + +![URLs for encoder section](https://assets.gcore.pro/docs/streaming-platform/live-streaming/create-a-live-stream/urls-for-encoder.png) + +#### Via the API + +You can also set up a pull stream via the Gcore API. The endpoint accepts the URL of the stream to pull from. + +Example of the API request: + +```http +PATCH /streaming/streams/{stream_id} +``` + +```json +{ + "stream": { + "pull": true, + "uri": "srt://example.com/path/to/stream", + ... + } +} +``` + +Read more in [the API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/patch_streams_id). \ No newline at end of file diff --git a/streaming-platform/live-streaming/webrtc-to-hls-transcoding.mdx b/streaming-platform/live-streaming/protocols/webrtc.mdx similarity index 98% rename from streaming-platform/live-streaming/webrtc-to-hls-transcoding.mdx rename to streaming-platform/live-streaming/protocols/webrtc.mdx index 6769e0aa2..8cf91275c 100644 --- a/streaming-platform/live-streaming/webrtc-to-hls-transcoding.mdx +++ b/streaming-platform/live-streaming/protocols/webrtc.mdx @@ -1,513 +1,513 @@ ---- -title: WebRTC ingest and transcoding to HLS/DASH -sidebarTitle: WebRTC ingest and transcoding to HLS/DASH ---- - -Streaming videos using HLS and MPEG-DASH protocols is a simple and cost-effective way to show your video to large audiences. However, this requires the original streams to be in a certain format that browsers do not support natively. - -At the same time, WebRTC protocol works in any browser, but it's not as flexible when streaming to large audiences. - -Gcore [Video Streaming](https://gcore.com/streaming-platform) supports both WebRTC HTTP Ingest Protocol (WHIP) and WebRTC to HLS/DASH converter, giving you the advantages of these protocols. - - -![A diagram depicting WebRTC converting to LL-HLS/DASH](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/diagram-whip-hls-protocols-supported.png) - - - -## Advantages of WebRTC and conversion to HLS/DASH - -WebRTC ingest for streaming offers two key advantages over traditional RTMP and SRT protocols: - -1\. It runs directly in the presenter's browser, so no additional software is needed. - -2\. WebRTC can reduce stream latency. - -By using WebRTC WHIP for ingest, you can convert WebRTC to HLS/DASH playback, which provides the following benefits: - - * Fast ingest via WebRTC from a browser. - * Optimal stream distribution using HLS/DASH with [adaptive bitrate streaming](/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs#what-is-transcoding-with-abr) (ABR) through the CDN. - - -![A diagram depicting WebRTC transcoding and distribution via HLS/DASH](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/diagram-how-transcoding-is-configured.png) - - - -## How it works - -We use a dedicated WebRTC WHIP server to manage WebRTC ingest. This server handles both signaling and video data reception. Such a setup allows you to configure WebRTC on demand and continue to use all system capabilities to set up transcoding and delivery via CDN. - -The RTC WHIP server organizes signaling and receives video data. Signaling refers to the communication between WebRTC endpoints that are necessary to initiate and maintain a session. WHIP is an open specification for a simple signaling protocol that starts WebRTC sessions in an outgoing direction, such as streaming from your device. - -We use local servers in each region to ensure a minimal route from a user-presenter to the server. - -### WebRTC stream encoding parameters - -The stream must include at least one video track and one audio track: - - * Video must be encoded using H.264. - * Audio must use OPUS codec. - - - -If you use [OBS](https://obsproject.com/) or your own WHIP library, use the following video encoding parameters: - - * Codec H.264 with no B-frames and fast encoding: - - * **Encoder** : x264, or any of H.264 - * **CPU usage** : very fast - * **Keyframe interval** : 1 sec - * **Profile** : baseline - * **Tune** : zero latency - * **x264 options** : bframes=0 scenecut=0 - * Bitrate: - - * The lower the bitrate, the faster the data will be transmitted to the server. Choose the optimal one for your video. For example, 1-2 Mbps is usually enough for video broadcasts of online training format or online broadcasts with a presenter. - - - -For example, you might have the following settings in OBS: - - -![Example of listed OBS settings](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/example-obs-settings.png) - - - -### Supported WHIP clients - -You can use any libraries to send data via the WebRTC WHIP protocol. - - * Gcore WebRTC WHIP client - * [OBS](https://obsproject.com/) (Open Broadcaster Software) - * [@eyevinn/whip-web-client](https://web.whip.eyevinn.technology/) - * [whip-go](https://github.com/ggarber/whip-go) - * Larix Broadcaster (free apps for iOS and Android with WebRTC based on Pion; SDK is available) - - - -### LL-HLS and LL-DASH outputs - -Streams sent via WebRTC are transcoded in the same way as other streams received via RTMP and SRT. - -At the output, you can view the streams using any available protocols: - - * **MPEG-DASH** : ±2-4 seconds latency to a viewer with ABR. - * **LL-HLS** : ±3-4 seconds latency to a viewer with ABR. - * **HLS MPEG-TS** : legacy with [non-low-latency](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works#switch-to-legacy-hls-modes) (±10 seconds latency) with ABR. - - - -For WebRTC mode, we use a method of constant transcoding with an initial given resolution. This means that if WebRTC in a viewer's browser reduces the quality or resolution of the master stream (for example, to 360p) due to restrictions on the viewer's device (such as network conditions or CPU consumption), the transcoder will continue to transcode the reduced stream to the initial resolution (for example 1080p ABR). - -When the restrictions on the viewer's device are removed, quality will improve again. - - -**Tip** - -For more details about low-latency streaming, check out [How low-latency streaming works](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works). - - -## Convert WebRTC to HLS in the Customer Portal - -For instructions on how to convert a stream via API, refer to the [API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/get_streams_id). - -1\. In the Gcore Customer Portal, navigate to **Streaming**. - -2\. Open the Live Streaming** page and find a needed live stream. If you don't have one, create a stream first. - -3\. Click the stream name to open its settings. - -4\. In the **Quick start in browser** section, click **Go Live**. The broadcast will start automatically. - - -![Example of live broadcast](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/go-live-button.png) - - - -5\. Allow Gcore to access your camera and microphone. In several seconds the HLS/DASH stream will appear in an HTML video player. - -You'll see the result under the **Video preview** instead of a black area with the "No active streams found" message. This large window of an HTML video player is the transcoded version of the stream in HLS/DASH protocols using adaptive bitrate. - - -![Example of a fully launched stream](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/started-live-stream.png) - - - -A small window in the top-right corner is from your camera. It shows the stream taken from the webcam. - -There are also settings for selecting a camera and microphone if you have more than one option on your device. - -## Convert WebRTC to HLS in your environment - -We provide a [WebRTC WHIP library](https://rtckit.gvideo.io/0.72.0/index.esm.js) for working in browsers. It implements the basic system calls and simplifies working with WebRTC: - - * Wrapper for initializing WebRTC stream and connecting to the server. - * Camera and mic wrapper. - * Monitoring WebRTC events and calling appropriate handlers in your code. - - - -The latest library version, 0.72.0, is available at https://rtckit.gvideo.io/0.72.0/index.esm.js. - -### Start a stream with the Gcore WebRTC WHIP library - -Since WHIP is an open standard, many libraries have been released for it in different languages. You can use our [WebRTC WHIP](https://rtckit.gvideo.io/0.72.0/index.esm.js) or any other library specified in the [WHIP clients](/streaming-platform/live-streaming/webrtc-to-hls-transcoding#supported-whip-clients) section. - -Using our library, you can start the conversion with a few lines of code. To go live immediately, create a live stream in the Gcore Streaming dashboard and paste a URL into the example linked below: - -1\. In the Gcore Customer Portal, open the [Live Streaming](https://portal.gcore.com/streaming/streaming/editor/1740470) page. - -2\. Open the stream settings and copy a WHIP URL from the **WebRTC = > HLS parameters** section. - -3\. Open [WHIP demo app](https://stackblitz.com/edit/stackblitz-starters-j2r9ar?file=index.html) and paste the WHIP URL into the `WHIP_ENDPOINT const`. - - -![WHIP endpoint where to paste the info](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/copy-paste-whip-endpoint-in-demo-app.png) - - - -4\. Click the **Start** button. The steam will be started in the Customer Portal. - -You can find the technical reference manual on data types, interfaces, methods, and other components in the [gcorevideo/rtckit](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.md) repository. - -### Start a stream with your own backend or frontend - - - - To create a new stream, send a POST request to the following endpoint: `https://api.gcore.com/streaming/streams`. - -Example request: - -```sh -curl -L 'https://api.gcore.com/streaming/streams' \ --H 'Content-Type: application/json' \ --H 'Authorization: APIKey 1111$3ec8…9604e' \ --d '{ - "name": "WebRTC to HLS demo", - "active": true -}' - ``` - -Example response: - -```json -{ - "id": 1683264, - "name": "WebRTC to HLS demo", - "push_url_whip": "https://whip.gvideo.co/1965207_561f4742ec38ae6386a6e7e637c03041/whip", … -} - ``` - -Use the `"push_url_whip"` value from the response to start the stream. - - - Get access and data from the microphone and camera: - -```js -import { WebrtcStreaming } from 'https://rtckit.gvideo.io/0.68.2/index.esm.js'; -const WHIP_ENDPOINT = '{push_url_whip}'; -const webrtc = new WebrtcStreaming(WHIP_ENDPOINT, {...}); -``` - -Send a local stream to the WHIP server: - -```js -webrtc.openSourceStream({ - audio: mic, - video: cam, - resolution: 1080, -}) - ``` - -Note that if a user stops streaming to the ingester, for example, by closing the browser tab, the stream settings will be terminated. When the user resumes streaming from any browser, the ingester will pick up the stream. However, there will be a brief delay before the ingested stream becomes playable. - -If a user tries to stream to the same endpoint where another user is already streaming, the former will get an error message from the media server. The current stream will remain uninterrupted. - - - -### Play HLS or DASH - -After sending the stream from frontend, the stream will start transcoding. In ±2-7 seconds, the HLS and MPEG-DASH versions will be ready for viewing. - -The stream can be viewed through the built-in web player or using direct links to the manifests. You can take these links from the API response. - -Examples: - - * Web player: https://player.gvideo.co/streams/102748_1965207 - * LL-HLS manifest: https://102748.gvideo.io/cmaf/102748_1965207/master.m3u8 - * DASH manifest: https://102748.gvideo.io/cmaf/102748_1965207/index.mpd - - - -Send a GET request to the following endpoint: `https://api.gcore.com/streaming/streams/{id}`. - -Example request: - -```sh -curl -L 'https://api.gcore.com/streaming/streams/1965207' \ --H 'Authorization: APIKey 1111$3ec8…9604e' - ``` - -Example response: - -```json - -{ - "id": 1965207, - "iframe_url": "https://player.gvideo.co/streams/102748_1965207", - "hls_cmaf_url": "https://demo-public.gvideo.io/cmaf/102748_1965207/master.m3u8", - "hls_mpegts_url": "https://demo-public.gvideo.io/mpegts/102748_1965207/master_mpegts.m3u8", - "dash_url": "https://demo-public.gvideo.io/cmaf/102748_1965207/index.mpd", - … -} - - ``` - -### Deactivate a finished stream - - - - Update the stream by sending a PATCH request to the following endpoint: `https://api.gcore.com/streaming/streams/{id}`. - -Example request: - -```sh -curl -L -X PATCH 'https://api.gcore.com/streaming/streams/1965207' \ --H 'Content-Type: application/json' \ --H 'Authorization: APIKey 1111$3ec8…9604e' ' \ --d '{ - "active": false - }' -``` - -Alternatively, you can delete the stream by sending the DELETE request to `https://api.gcore.com/streaming/streams/$id`. - -Example request: - -```sh -curl -L -X DELETE 'https://api.gcore.com/streaming/streams/1965207' \ --H 'Authorization: APIKey 1111$3ec8…9604e' - ``` - - - Example command to close the stream: `webrtc.close()` - - - -### Demo projects of streaming with frontend and backend - - - - You can find a detailed description of this version above. To view the full code, inspect the https://stackblitz.com/edit/stackblitz-starters-j2r9ar?file=index.html. - - -![Example of demo project 1](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/demo-1-example.png) - - - This demo depicts a complete frontend and backend implementation with the Nuxt framework. It's a fully functional prebuilt version with a demo stream from our demo server. - -The implementation includes: stream generation, initialization of WebRTC data in a browser, video transmission from the browser to the server, and displaying the HLS/DASH web player with transcoded broadcast. - -We've added the demo instance and source code to help you explore the implementation in action: - - * Demo app – https://gcore-webrtc-sdk-js-nuxt.vercel.app/host?token=123 - * Source code – https://github.com/G-Core/gcore-webrtc-sdk-js/tree/main/apps/ingest-demo-nuxt - - - -To start streaming: - -1\. Select your camera and microphone - -2\. In the **Host** section, click **Start** under the video preview. - -3\. Click the **Watch** link. - - -![Example of demo project 2](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/demo-2-example.png) - - - -## Troubleshooting - -If you experience issues related to our streaming service, check out the following sections. They outline common problems and recommended resolution steps. - -### Error handling - -**NetworkError** - -For details, refer to [NetworkError class](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.networkerror.md). - -The ingestion service is unavailable or is unreachable from the client's network. The error message includes a description of the error cause. - -In such cases, the application should render itself unavailable and report the error to Gcore support. The app should not retry the operation, as the retry logic is already implemented in the SDK. - -**ServerRequestError** - -For details, check out [ServerRequestError class](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.serverrequesterror.md). - -The ingestion server returned an error, which can be identified by inspecting the `status` and `detail` fields of the error object. - - - -| HTTP status code | Explanation | Example | -|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 400 | The client’s request is wrong. It may be due to the incorrect request parameters sent by the WHIP client. If you see this error with an unintelligible description or with no description at all, contact the [Gcore support team](mailto:support@gcore.com).

A special case to note is when multiple clients attempt to stream to the same endpoint simultaneously. Check the example for details. | **err.message**: Server request failed with status 400
**err.status**: 400
**err.detail**: `{"error": "someone is already publishing to the path '1960197_XXX'"}` | -| 403 | The endpoint you are trying to connect to is unreachable.

Probable causes:
  • A stream doesn’t exist.
  • A stream was not closed correctly, but you push to that broken stream (time out is ±30 seconds. In this case, try again after that time).
  • Your token is invalid.
  • Another stream setting prevents it from ingesting WebRTC.
| **err.message**: Server request failed with status 403
**err.status**: 403 | -| 500, 502, 503, 504, 5xx (infrequently) | Gcore infrastructure is experiencing pressure or outage. Contact the [Gcore support team](mailto:support@gcore.com).
The app should render itself unavailable. It should not retry the request. | **err.message**: Server request failed with status 504
**err.status**: 504 | - -
- - -**TimeoutError** - -For details, check out [TimeoutError class](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.timeouterror.md). - -Some operation has timed out. - - - -| Error message | Explanation | -|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Timeout waiting for ICE candidates | **Cause 1**. Incorrectly configured [ICE servers](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/3e45d6e8beebcc7221625bd9e3b3b1749d9405ae/packages/rtckit/docs/api/rtckit.whipclientoptions.md). The default configuration (when no ICE servers are specified) is to fetch a list of them from the WHIP endpoint.

**Cause 2**. ICE servers fetched from the WHIP endpoint are unreachable from your client’s location. This is very unlikely to happen.

In both cases, start by checking the ICE servers your WebRTC uses as described in the [Network troubleshooting section](/streaming-platform/live-streaming/webrtc-to-hls-transcoding#network-troubleshooting). If that doesn’t work, contact the [Gcore support team](mailto:support@gcore.com).

The client app should render itself unavailable due to network conditions as an explanation. | - -
- - -Other types of errors are described in our [SDK docs](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.md). End-users should not encounter these errors, and there is no way to handle them in a real application apart from reporting the error occurrence. - -Some SDK methods might also throw browser's native exceptions, such as [WebrtcStreaming.openSourceStream](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.webrtcstreaming.opensourcestream.md) and the methods of the [MediaDevicesHelper](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.mediadeviceshelper.md) throw [getUserMedia-originated exceptions](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#exceptions). The application should handle them accordingly. - -### Sudden disconnection of camera or microphone - -Sometimes, users use external or plug-in cameras and microphones, and these devices can be disconnected at any time. For example: - - * A USB camera cable might be unplugged. - * AirPods may be placed back in their case. - - - -If a camera or microphone is accidentally disconnected, you need to track such cases programmatically. Enable the `mediaDevicesAutoSwitch` option and subscribe to the event: - - * set mediaDevicesAutoSwitch: true - * catch WebrtcStreamingEvents - - - -The new algorithm ensures uninterrupted broadcasting by prompting the browser to switch to another available camera or microphone if the current device becomes unavailable. - -When such a situation occurs, you will know which device was disconnected and which one was connected instead. This will allow you to visualize (if necessary) the new connected device in your interface. - - -![A list of available devices with USB audio selected](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/microphone-options.png) - - - -### Debugging with Chrome WebRTC internals tool - -Chrome is really good at working with WebRTC because it has a built-in tool to help developers see how things are working. - -Chrome v87+ has a special page called chrome://webrtc-internals where you can check your WebRTC calls: - -1\. Open a new Chrome tab and navigate to chrome://webrtc-internals while you're in a WebRTC call. On this page, you can view detailed information about the video and audio streams, connection setup, and more. - -2\. Use the provided information to find potential problems. For instance, when videos won't play, calls won't connect, or videos are slow. - -One of the parameters you can monitor in Stats graphs for candidate-pair: - - * **AvailableOutgoingBitrate** - - -![AvailableOutgoingBitrate graph in Chrome WebRTC internals](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/available-outgoing-bitrate-graph.png) - - - -You can also follow the following parameters from the **Stats graphs for outbound-rtp** : - - * bytesSent_in_bits/s - * targetBitrate - * frameWidth - * frameHeight - * framesSent/s - - - -For example, consider how unevenly frames are sent from the browser in the following screenshot: - - -![frameWidth and frameHeight graphs in Chrome WebRTC internals](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/frame-graphs.png) - - - -### Network troubleshooting - -#### Video stream is poorly transcoded or constantly stops - -If a stream in the player constantly stops, is interrupted, or has poor quality, the issue is likely related to slow transmission of the original stream from a presenter via WebRTC. - -WebRTC is very demanding of the quality of internet connection from client to server. At the same time, standard implementations take into account many parameters on a local device, which can cause slower transmission of data or even stop it altogether until conditions are improved. - -To diagnose such situations: - -1\. Use the **VideoResolutionChangeDetector** plugin. It allows you to show a message about bad network conditions on a viewer's device. - -2\. Use Chrome's WebRTC debug tool that's available via this link: chrome:\webrtc-internals. - -Network congestion, occurring when resource demand surpasses capacity, leads to packet loss, increased latency, and jitter, hindering real-time communication, with congestion control algorithms optimizing performance by regulating data packet flow. You can read how WebRTC uses Transport Wide Congestion Control (TWCC) to control it in [thearticle about TWCC](https://bloggeek.me/webrtcglossary/transport-cc/). - -The available bitrate is calculated in the **availableOutgoingBitrate** parameter, which indicates the available outbound capacity of the network connection. The higher the value, the more bandwidth you can assume is available for outgoing data. The value is reported in bits per second and is computed over a 1-second interval. - -The most likely scenario for quality degradation occurs here when the channel width becomes insufficient to send good resolution. - -However, sometimes the connection is even worse when packets are lost. In this case, the server starts sending NACK (Negative Acknowledgement) packets. You can read more about this issue in the [NACK overview article](https://bloggeek.me/webrtcglossary/nack/). - -More and more data start to be resent, which leads to increased latency or gaps in frames. In this case, the transcoder doesn't receive frames on time, causing the video to interrupt or stop altogether. You can monitor and debug this issue in Chrome's webrtc-internals tool: - - -![Example graphs in Chrome WebRTC internals tool](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/sample-graphs-network-troubleshooting.png) - - - -What to do in such situations: - - * Always show users a message about changed conditions. In 99% of cases, the issue is related to the user's internet conditions. - * Use TCP as the delivery protocol instead of UDP. - * Use the TURN server for delivery instead of sending directly to the media server. - - - -#### Issues with ICE servers - -If you experience problems with timeout waiting for an ICE candidate, check your ICE server configuration. - -ICE servers used by the WHIP client can be configured explicitly using the iceServers [configuration option](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/3e45d6e8beebcc7221625bd9e3b3b1749d9405ae/packages/rtckit/docs/api/rtckit.whipclientoptions.md). Otherwise, they are fetched from Gcore's media server in the response to a session initiation request. - -In the case of the latter, check what the server returns in the `Link` headers. For example: - - -![Example data in Link headers](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/link-headers.png) - -``` -Link: ; rel="ice-server" -Link: ; rel="ice-server"; username="1730558739:0nu0id47meqbsyvpz743"; credential="IswwB19KAEWQujy3X/c4D9GjZj8="; credential-type="password" -Link: ... -``` - -You can also inspect the servers using chrome://webrtc-internals or an alternative tool: - - -![Example of servers check in Chome WebRTC internals](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/check-sever-config.png) - - - -After you verify your server configuration, use the [Trickle ICE](https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/) app to test the servers. - -Add a STUN or TURN server and check how it works. If everything functions correctly, the results will show: - - * A srvrflx candidate for STUN server - * A relay candidate for a TURN server - - - -If you don't see these results, your STUN or TURN server may be misconfigured, or there is an outage. - +--- +title: WebRTC ingest and transcoding to HLS/DASH +sidebarTitle: WebRTC ingest and transcoding to HLS/DASH +--- + +Streaming videos using HLS and MPEG-DASH protocols is a simple and cost-effective way to show your video to large audiences. However, this requires the original streams to be in a certain format that browsers do not support natively. + +At the same time, WebRTC protocol works in any browser, but it's not as flexible when streaming to large audiences. + +Gcore [Video Streaming](https://gcore.com/streaming-platform) supports both WebRTC HTTP Ingest Protocol (WHIP) and WebRTC to HLS/DASH converter, giving you the advantages of these protocols. + + +![A diagram depicting WebRTC converting to LL-HLS/DASH](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/diagram-whip-hls-protocols-supported.png) + + + +## Advantages of WebRTC and conversion to HLS/DASH + +WebRTC ingest for streaming offers two key advantages over traditional RTMP and SRT protocols: + +1\. It runs directly in the presenter's browser, so no additional software is needed. + +2\. WebRTC can reduce stream latency. + +By using WebRTC WHIP for ingest, you can convert WebRTC to HLS/DASH playback, which provides the following benefits: + + * Fast ingest via WebRTC from a browser. + * Optimal stream distribution using HLS/DASH with [adaptive bitrate streaming](/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs#what-is-transcoding-with-abr) (ABR) through the CDN. + + +![A diagram depicting WebRTC transcoding and distribution via HLS/DASH](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/diagram-how-transcoding-is-configured.png) + + + +## How it works + +We use a dedicated WebRTC WHIP server to manage WebRTC ingest. This server handles both signaling and video data reception. Such a setup allows you to configure WebRTC on demand and continue to use all system capabilities to set up transcoding and delivery via CDN. + +The RTC WHIP server organizes signaling and receives video data. Signaling refers to the communication between WebRTC endpoints that are necessary to initiate and maintain a session. WHIP is an open specification for a simple signaling protocol that starts WebRTC sessions in an outgoing direction, such as streaming from your device. + +We use local servers in each region to ensure a minimal route from a user-presenter to the server. + +### WebRTC stream encoding parameters + +The stream must include at least one video track and one audio track: + + * Video must be encoded using H.264. + * Audio must use OPUS codec. + + + +If you use [OBS](https://obsproject.com/) or your own WHIP library, use the following video encoding parameters: + + * Codec H.264 with no B-frames and fast encoding: + + * **Encoder** : x264, or any of H.264 + * **CPU usage** : very fast + * **Keyframe interval** : 1 sec + * **Profile** : baseline + * **Tune** : zero latency + * **x264 options** : bframes=0 scenecut=0 + * Bitrate: + + * The lower the bitrate, the faster the data will be transmitted to the server. Choose the optimal one for your video. For example, 1-2 Mbps is usually enough for video broadcasts of online training format or online broadcasts with a presenter. + + + +For example, you might have the following settings in OBS: + + +![Example of listed OBS settings](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/example-obs-settings.png) + + + +### Supported WHIP clients + +You can use any libraries to send data via the WebRTC WHIP protocol. + + * Gcore WebRTC WHIP client + * [OBS](https://obsproject.com/) (Open Broadcaster Software) + * [@eyevinn/whip-web-client](https://web.whip.eyevinn.technology/) + * [whip-go](https://github.com/ggarber/whip-go) + * Larix Broadcaster (free apps for iOS and Android with WebRTC based on Pion; SDK is available) + + + +### LL-HLS and LL-DASH outputs + +Streams sent via WebRTC are transcoded in the same way as other streams received via RTMP and SRT. + +At the output, you can view the streams using any available protocols: + + * **MPEG-DASH** : ±2-4 seconds latency to a viewer with ABR. + * **LL-HLS** : ±3-4 seconds latency to a viewer with ABR. + * **HLS MPEG-TS** : legacy with [non-low-latency](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works#switch-to-legacy-hls-modes) (±10 seconds latency) with ABR. + + + +For WebRTC mode, we use a method of constant transcoding with an initial given resolution. This means that if WebRTC in a viewer's browser reduces the quality or resolution of the master stream (for example, to 360p) due to restrictions on the viewer's device (such as network conditions or CPU consumption), the transcoder will continue to transcode the reduced stream to the initial resolution (for example 1080p ABR). + +When the restrictions on the viewer's device are removed, quality will improve again. + + +**Tip** + +For more details about low-latency streaming, check out [How low-latency streaming works](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works). + + +## Convert WebRTC to HLS in the Customer Portal + +For instructions on how to convert a stream via API, refer to the [API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/get_streams_id). + +1\. In the Gcore Customer Portal, navigate to **Streaming**. + +2\. Open the Live Streaming** page and find a needed live stream. If you don't have one, create a stream first. + +3\. Click the stream name to open its settings. + +4\. In the **Quick start in browser** section, click **Go Live**. The broadcast will start automatically. + + +![Example of live broadcast](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/go-live-button.png) + + + +5\. Allow Gcore to access your camera and microphone. In several seconds the HLS/DASH stream will appear in an HTML video player. + +You'll see the result under the **Video preview** instead of a black area with the "No active streams found" message. This large window of an HTML video player is the transcoded version of the stream in HLS/DASH protocols using adaptive bitrate. + + +![Example of a fully launched stream](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/started-live-stream.png) + + + +A small window in the top-right corner is from your camera. It shows the stream taken from the webcam. + +There are also settings for selecting a camera and microphone if you have more than one option on your device. + +## Convert WebRTC to HLS in your environment + +We provide a [WebRTC WHIP library](https://rtckit.gvideo.io/0.72.0/index.esm.js) for working in browsers. It implements the basic system calls and simplifies working with WebRTC: + + * Wrapper for initializing WebRTC stream and connecting to the server. + * Camera and mic wrapper. + * Monitoring WebRTC events and calling appropriate handlers in your code. + + + +The latest library version, 0.72.0, is available at https://rtckit.gvideo.io/0.72.0/index.esm.js. + +### Start a stream with the Gcore WebRTC WHIP library + +Since WHIP is an open standard, many libraries have been released for it in different languages. You can use our [WebRTC WHIP](https://rtckit.gvideo.io/0.72.0/index.esm.js) or any other library specified in the [WHIP clients](/streaming-platform/live-streaming/webrtc-to-hls-transcoding#supported-whip-clients) section. + +Using our library, you can start the conversion with a few lines of code. To go live immediately, create a live stream in the Gcore Streaming dashboard and paste a URL into the example linked below: + +1\. In the Gcore Customer Portal, open the [Live Streaming](https://portal.gcore.com/streaming/streaming/editor/1740470) page. + +2\. Open the stream settings and copy a WHIP URL from the **WebRTC = > HLS parameters** section. + +3\. Open [WHIP demo app](https://stackblitz.com/edit/stackblitz-starters-j2r9ar?file=index.html) and paste the WHIP URL into the `WHIP_ENDPOINT const`. + + +![WHIP endpoint where to paste the info](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/copy-paste-whip-endpoint-in-demo-app.png) + + + +4\. Click the **Start** button. The steam will be started in the Customer Portal. + +You can find the technical reference manual on data types, interfaces, methods, and other components in the [gcorevideo/rtckit](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.md) repository. + +### Start a stream with your own backend or frontend + + + + To create a new stream, send a POST request to the following endpoint: `https://api.gcore.com/streaming/streams`. + +Example request: + +```sh +curl -L 'https://api.gcore.com/streaming/streams' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: APIKey 1111$3ec8…9604e' \ +-d '{ + "name": "WebRTC to HLS demo", + "active": true +}' + ``` + +Example response: + +```json +{ + "id": 1683264, + "name": "WebRTC to HLS demo", + "push_url_whip": "https://whip.gvideo.co/1965207_561f4742ec38ae6386a6e7e637c03041/whip", … +} + ``` + +Use the `"push_url_whip"` value from the response to start the stream. + + + Get access and data from the microphone and camera: + +```js +import { WebrtcStreaming } from 'https://rtckit.gvideo.io/0.68.2/index.esm.js'; +const WHIP_ENDPOINT = '{push_url_whip}'; +const webrtc = new WebrtcStreaming(WHIP_ENDPOINT, {...}); +``` + +Send a local stream to the WHIP server: + +```js +webrtc.openSourceStream({ + audio: mic, + video: cam, + resolution: 1080, +}) + ``` + +Note that if a user stops streaming to the ingester, for example, by closing the browser tab, the stream settings will be terminated. When the user resumes streaming from any browser, the ingester will pick up the stream. However, there will be a brief delay before the ingested stream becomes playable. + +If a user tries to stream to the same endpoint where another user is already streaming, the former will get an error message from the media server. The current stream will remain uninterrupted. + + + +### Play HLS or DASH + +After sending the stream from frontend, the stream will start transcoding. In ±2-7 seconds, the HLS and MPEG-DASH versions will be ready for viewing. + +The stream can be viewed through the built-in web player or using direct links to the manifests. You can take these links from the API response. + +Examples: + + * Web player: https://player.gvideo.co/streams/102748_1965207 + * LL-HLS manifest: https://102748.gvideo.io/cmaf/102748_1965207/master.m3u8 + * DASH manifest: https://102748.gvideo.io/cmaf/102748_1965207/index.mpd + + + +Send a GET request to the following endpoint: `https://api.gcore.com/streaming/streams/{id}`. + +Example request: + +```sh +curl -L 'https://api.gcore.com/streaming/streams/1965207' \ +-H 'Authorization: APIKey 1111$3ec8…9604e' + ``` + +Example response: + +```json + +{ + "id": 1965207, + "iframe_url": "https://player.gvideo.co/streams/102748_1965207", + "hls_cmaf_url": "https://demo-public.gvideo.io/cmaf/102748_1965207/master.m3u8", + "hls_mpegts_url": "https://demo-public.gvideo.io/mpegts/102748_1965207/master_mpegts.m3u8", + "dash_url": "https://demo-public.gvideo.io/cmaf/102748_1965207/index.mpd", + … +} + + ``` + +### Deactivate a finished stream + + + + Update the stream by sending a PATCH request to the following endpoint: `https://api.gcore.com/streaming/streams/{id}`. + +Example request: + +```sh +curl -L -X PATCH 'https://api.gcore.com/streaming/streams/1965207' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: APIKey 1111$3ec8…9604e' ' \ +-d '{ + "active": false + }' +``` + +Alternatively, you can delete the stream by sending the DELETE request to `https://api.gcore.com/streaming/streams/$id`. + +Example request: + +```sh +curl -L -X DELETE 'https://api.gcore.com/streaming/streams/1965207' \ +-H 'Authorization: APIKey 1111$3ec8…9604e' + ``` + + + Example command to close the stream: `webrtc.close()` + + + +### Demo projects of streaming with frontend and backend + + + + You can find a detailed description of this version above. To view the full code, inspect the https://stackblitz.com/edit/stackblitz-starters-j2r9ar?file=index.html. + + +![Example of demo project 1](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/demo-1-example.png) + + + This demo depicts a complete frontend and backend implementation with the Nuxt framework. It's a fully functional prebuilt version with a demo stream from our demo server. + +The implementation includes: stream generation, initialization of WebRTC data in a browser, video transmission from the browser to the server, and displaying the HLS/DASH web player with transcoded broadcast. + +We've added the demo instance and source code to help you explore the implementation in action: + + * Demo app – https://gcore-webrtc-sdk-js-nuxt.vercel.app/host?token=123 + * Source code – https://github.com/G-Core/gcore-webrtc-sdk-js/tree/main/apps/ingest-demo-nuxt + + + +To start streaming: + +1\. Select your camera and microphone + +2\. In the **Host** section, click **Start** under the video preview. + +3\. Click the **Watch** link. + + +![Example of demo project 2](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/demo-2-example.png) + + + +## Troubleshooting + +If you experience issues related to our streaming service, check out the following sections. They outline common problems and recommended resolution steps. + +### Error handling + +**NetworkError** + +For details, refer to [NetworkError class](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.networkerror.md). + +The ingestion service is unavailable or is unreachable from the client's network. The error message includes a description of the error cause. + +In such cases, the application should render itself unavailable and report the error to Gcore support. The app should not retry the operation, as the retry logic is already implemented in the SDK. + +**ServerRequestError** + +For details, check out [ServerRequestError class](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.serverrequesterror.md). + +The ingestion server returned an error, which can be identified by inspecting the `status` and `detail` fields of the error object. + + + +| HTTP status code | Explanation | Example | +|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 400 | The client’s request is wrong. It may be due to the incorrect request parameters sent by the WHIP client. If you see this error with an unintelligible description or with no description at all, contact the [Gcore support team](mailto:support@gcore.com).

A special case to note is when multiple clients attempt to stream to the same endpoint simultaneously. Check the example for details. | **err.message**: Server request failed with status 400
**err.status**: 400
**err.detail**: `{"error": "someone is already publishing to the path '1960197_XXX'"}` | +| 403 | The endpoint you are trying to connect to is unreachable.

Probable causes:
  • A stream doesn’t exist.
  • A stream was not closed correctly, but you push to that broken stream (time out is ±30 seconds. In this case, try again after that time).
  • Your token is invalid.
  • Another stream setting prevents it from ingesting WebRTC.
| **err.message**: Server request failed with status 403
**err.status**: 403 | +| 500, 502, 503, 504, 5xx (infrequently) | Gcore infrastructure is experiencing pressure or outage. Contact the [Gcore support team](mailto:support@gcore.com).
The app should render itself unavailable. It should not retry the request. | **err.message**: Server request failed with status 504
**err.status**: 504 | + +
+ + +**TimeoutError** + +For details, check out [TimeoutError class](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.timeouterror.md). + +Some operation has timed out. + + + +| Error message | Explanation | +|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Timeout waiting for ICE candidates | **Cause 1**. Incorrectly configured [ICE servers](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/3e45d6e8beebcc7221625bd9e3b3b1749d9405ae/packages/rtckit/docs/api/rtckit.whipclientoptions.md). The default configuration (when no ICE servers are specified) is to fetch a list of them from the WHIP endpoint.

**Cause 2**. ICE servers fetched from the WHIP endpoint are unreachable from your client’s location. This is very unlikely to happen.

In both cases, start by checking the ICE servers your WebRTC uses as described in the [Network troubleshooting section](/streaming-platform/live-streaming/webrtc-to-hls-transcoding#network-troubleshooting). If that doesn’t work, contact the [Gcore support team](mailto:support@gcore.com).

The client app should render itself unavailable due to network conditions as an explanation. | + +
+ + +Other types of errors are described in our [SDK docs](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.md). End-users should not encounter these errors, and there is no way to handle them in a real application apart from reporting the error occurrence. + +Some SDK methods might also throw browser's native exceptions, such as [WebrtcStreaming.openSourceStream](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.webrtcstreaming.opensourcestream.md) and the methods of the [MediaDevicesHelper](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/main/packages/rtckit/docs/api/rtckit.mediadeviceshelper.md) throw [getUserMedia-originated exceptions](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#exceptions). The application should handle them accordingly. + +### Sudden disconnection of camera or microphone + +Sometimes, users use external or plug-in cameras and microphones, and these devices can be disconnected at any time. For example: + + * A USB camera cable might be unplugged. + * AirPods may be placed back in their case. + + + +If a camera or microphone is accidentally disconnected, you need to track such cases programmatically. Enable the `mediaDevicesAutoSwitch` option and subscribe to the event: + + * set mediaDevicesAutoSwitch: true + * catch WebrtcStreamingEvents + + + +The new algorithm ensures uninterrupted broadcasting by prompting the browser to switch to another available camera or microphone if the current device becomes unavailable. + +When such a situation occurs, you will know which device was disconnected and which one was connected instead. This will allow you to visualize (if necessary) the new connected device in your interface. + + +![A list of available devices with USB audio selected](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/microphone-options.png) + + + +### Debugging with Chrome WebRTC internals tool + +Chrome is really good at working with WebRTC because it has a built-in tool to help developers see how things are working. + +Chrome v87+ has a special page called chrome://webrtc-internals where you can check your WebRTC calls: + +1\. Open a new Chrome tab and navigate to chrome://webrtc-internals while you're in a WebRTC call. On this page, you can view detailed information about the video and audio streams, connection setup, and more. + +2\. Use the provided information to find potential problems. For instance, when videos won't play, calls won't connect, or videos are slow. + +One of the parameters you can monitor in Stats graphs for candidate-pair: + + * **AvailableOutgoingBitrate** + + +![AvailableOutgoingBitrate graph in Chrome WebRTC internals](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/available-outgoing-bitrate-graph.png) + + + +You can also follow the following parameters from the **Stats graphs for outbound-rtp** : + + * bytesSent_in_bits/s + * targetBitrate + * frameWidth + * frameHeight + * framesSent/s + + + +For example, consider how unevenly frames are sent from the browser in the following screenshot: + + +![frameWidth and frameHeight graphs in Chrome WebRTC internals](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/frame-graphs.png) + + + +### Network troubleshooting + +#### Video stream is poorly transcoded or constantly stops + +If a stream in the player constantly stops, is interrupted, or has poor quality, the issue is likely related to slow transmission of the original stream from a presenter via WebRTC. + +WebRTC is very demanding of the quality of internet connection from client to server. At the same time, standard implementations take into account many parameters on a local device, which can cause slower transmission of data or even stop it altogether until conditions are improved. + +To diagnose such situations: + +1\. Use the **VideoResolutionChangeDetector** plugin. It allows you to show a message about bad network conditions on a viewer's device. + +2\. Use Chrome's WebRTC debug tool that's available via this link: chrome:\webrtc-internals. + +Network congestion, occurring when resource demand surpasses capacity, leads to packet loss, increased latency, and jitter, hindering real-time communication, with congestion control algorithms optimizing performance by regulating data packet flow. You can read how WebRTC uses Transport Wide Congestion Control (TWCC) to control it in [thearticle about TWCC](https://bloggeek.me/webrtcglossary/transport-cc/). + +The available bitrate is calculated in the **availableOutgoingBitrate** parameter, which indicates the available outbound capacity of the network connection. The higher the value, the more bandwidth you can assume is available for outgoing data. The value is reported in bits per second and is computed over a 1-second interval. + +The most likely scenario for quality degradation occurs here when the channel width becomes insufficient to send good resolution. + +However, sometimes the connection is even worse when packets are lost. In this case, the server starts sending NACK (Negative Acknowledgement) packets. You can read more about this issue in the [NACK overview article](https://bloggeek.me/webrtcglossary/nack/). + +More and more data start to be resent, which leads to increased latency or gaps in frames. In this case, the transcoder doesn't receive frames on time, causing the video to interrupt or stop altogether. You can monitor and debug this issue in Chrome's webrtc-internals tool: + + +![Example graphs in Chrome WebRTC internals tool](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/sample-graphs-network-troubleshooting.png) + + + +What to do in such situations: + + * Always show users a message about changed conditions. In 99% of cases, the issue is related to the user's internet conditions. + * Use TCP as the delivery protocol instead of UDP. + * Use the TURN server for delivery instead of sending directly to the media server. + + + +#### Issues with ICE servers + +If you experience problems with timeout waiting for an ICE candidate, check your ICE server configuration. + +ICE servers used by the WHIP client can be configured explicitly using the iceServers [configuration option](https://github.com/G-Core/gcore-webrtc-sdk-js/blob/3e45d6e8beebcc7221625bd9e3b3b1749d9405ae/packages/rtckit/docs/api/rtckit.whipclientoptions.md). Otherwise, they are fetched from Gcore's media server in the response to a session initiation request. + +In the case of the latter, check what the server returns in the `Link` headers. For example: + + +![Example data in Link headers](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/link-headers.png) + +``` +Link: ; rel="ice-server" +Link: ; rel="ice-server"; username="1730558739:0nu0id47meqbsyvpz743"; credential="IswwB19KAEWQujy3X/c4D9GjZj8="; credential-type="password" +Link: ... +``` + +You can also inspect the servers using chrome://webrtc-internals or an alternative tool: + + +![Example of servers check in Chome WebRTC internals](/images/docs/streaming-platform/live-streaming/webrtc-to-hls-transcoding/check-sever-config.png) + + + +After you verify your server configuration, use the [Trickle ICE](https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/) app to test the servers. + +Add a STUN or TURN server and check how it works. If everything functions correctly, the results will show: + + * A srvrflx candidate for STUN server + * A relay candidate for a TURN server + + + +If you don't see these results, your STUN or TURN server may be misconfigured, or there is an outage. + The [Gcore support team](mailto:support@gcore.com) will help you handle that. In the request, include the results of your ICE connectivity check to help us resolve the issue quickly. \ No newline at end of file diff --git a/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-liveu-solo.mdx b/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-liveu-solo.mdx deleted file mode 100644 index cbd8a9971..000000000 --- a/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-liveu-solo.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Push live streams via LiveU Solo -sidebarTitle: LiveU Solo ---- - -Install and launch LiveU Solo. - -Click on the «Edit Destination» button. - - -![ LiveU Solo](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-liveu-solo/mceclip1.png) - - - -Find RTMP URL and a stream key in the Gcore Customer Portal according to the [Create a live stream](/streaming-platform/live-streaming/create-a-live-stream) guide. Choose the stream, click edit, and look at the Push URL. - -Fill the «Primary Ingress URL» field with this part of PUSH URL: _rtmp://vp-push-ed1.gvideo.co/in/_ and «Stream name» field with the key — all the remaining symbols: _9cb3fdee0836564bd0046dasdb0e4de3sda32af712411313_. - -Run the stream. \ No newline at end of file diff --git a/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs.mdx b/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs.mdx deleted file mode 100644 index 86793eedb..000000000 --- a/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Push live streams via OBS -sidebarTitle: OBS (Open Broadcaster Software) ---- - -## What is an OBS? - -Open Broadcaster Software (OBS) is a free and open-source encoder for video recording, screencasting, and live streaming. It's suitable for video game streaming, blogging, educational content, and more. - -OBS links your device (a laptop or a PC) and different streaming platforms (Gcore Video Streaming, YouTube, Twitch, etc.). It takes an image captured by a camera, converts it into a video stream, and then sends it to the streaming platform. - -## Configure the OBS encoder for GCore streaming - -1\. Download Open Broadcaster Software (OBS) from the [official website](https://obsproject.com) and install it. - -2\. Open the **Settings** section and go to the **Stream** tab. Complete the remaining steps in it. - - -![Stream tab.](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807190142097.png) - - - -3\. Select **Custom** from the dropdown list. - -4\. Enter the Server URL into the Server field and the unique key into the Stream Key field. To get the Server URL and key, go to the [Streaming list](https://streaming.gcore.com/streaming/list), open the Live stream settings you need, and copy the relevant value from the URLs for the encoder section. - -For example, if you see these values on the Live stream settings page: - - -![Live stream settings](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/11774973436177.png) - - - -paste them to the OBS Settings as follows: - - * _rtmp://vp-push-ix1.gvideo.co/in/_ is the Server; - * _400448?cdf2a7ccf990e464c2b…_ is the Stream Key. - - - -5\. Click the **Apply** button to save the new configuration. - -6\. Go to the main OBS menu, select the source of the stream (video capture device, display capture, etc.), and click **Start Streaming**. - - -![Start Streaming](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807465490193.png) - - - -7\. Once the streaming has started, go to the [Streaming list](https://streaming.gcore.com/streaming/list), open the Live Stream settings, and copy the link to embed the broadcast to your website. - - -![Streaming list](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/11775007043985.png) - - - -That's it. The stream from OBS will be broadcast to your website. - -## Manage the stream parameters - -To ensure optimal streaming performance, we recommend configuring the stream parameters you will send to our server. You can adjust these settings in the Output, Audio, and Video tabs within OBS. - -### Output parameters - -1\. Open OBS Settings and go to the **Output** tab. Select **Simple** mode. - -2\. Set the parameters as follows: - - * **Video Bitrate:** The resolution of your stream determines the required bitrate: The higher the resolution, the higher the bitrate. To stream at 720p resolution, set the bitrate to 2000Kbps. If you're broadcasting at 1080p, set the bitrate to 4000Kbps. - * **Audio Bitrate:** 128. - * **Encoder:** Software (x264), or any other H264 codec. - - -![Manage the stream parameters](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807571524241.png) - - - -3\. Click **Advanced** mode. - -4\. Set the parameters as follows: - - * **Rate control:** CRF (the default value is 23) - * **Keyframe Interval (0=auto):** 2s - * **CPU Usage Preset:** veryfast - * **Profile:** baseline - - - -5\. Click **Apply** to save the configuration. - - -![configuration](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807656645393.png) - - - -### Audio parameters - - -![Audio parameters](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807660371473.png) - - - -1\. Open OBS Settings and go to the Audio tab. - -2\. Set the Sample Rate to 44.1 kHz (default) or 48 kHz. Select **Stereo** for the best sound quality. - -3\. Click **Apply**. - -### Video parameters - -If you need to reduce the original resolution (downscale), follow the instructions in this section. If no resolution change is required, you can skip this step. - -1\. Open OBS Settings and go to the **Video** tab. - -2\. Set the following parameters: - - * **Output (Scaled) Resolution:** 1280×720 - * **Downscale Filter:** Bicubic - * **Common FPS Values:** 30 - - - -3\. Click **Apply**. - - -![Video parameters Apply](/images/docs/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs/10807613445521.png) - - - -**Hints.** You can see the stream's [output parameters here](/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs#output-parameters). If you need to increase the FPS to 60, make sure to also increase the bitrate accordingly for optimal stream quality. \ No newline at end of file From 4f5fa158c5ae6d773194090ede1429d16c91714e Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 13:23:11 +0000 Subject: [PATCH 15/29] Documentation edits made through Mintlify web editor --- .../how-low-latency-streaming-works.mdx | 170 +++++++++--------- 1 file changed, 85 insertions(+), 85 deletions(-) rename streaming-platform/{live-streams-and-videos-protocols-and-codecs => live-streaming}/how-low-latency-streaming-works.mdx (98%) diff --git a/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works.mdx b/streaming-platform/live-streaming/how-low-latency-streaming-works.mdx similarity index 98% rename from streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works.mdx rename to streaming-platform/live-streaming/how-low-latency-streaming-works.mdx index 350eac1fc..a855eacc9 100644 --- a/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works.mdx +++ b/streaming-platform/live-streaming/how-low-latency-streaming-works.mdx @@ -1,86 +1,86 @@ ---- -title: How low latency streaming works -sidebarTitle: Low latency streaming ---- - -Streaming latency is the timespan between the moment a frame is captured and when that frame is displayed on the viewers' screens. Latency occurs because each stream is processed several times during broadcasting to be delivered worldwide: - -1\. **Encoding (or packaging).** In this step, the streaming service retrieves your stream in any format, converts it into the format for delivery through CDN, and divides it into small fragments. - -2\. **Transferring.** In this step, CDN servers pull the processed stream, cache it, and send it to the end-users. - -3\. **Receipt by players.** In this step, end-user players load the fragments and buffer them. - -Each step affects latency, so the total timespan can increase to 30–40 seconds, especially if the streaming processing isn't optimized. For some companies (such as sports or metaverse events, or news releases), such latency is too large, and it's crucial to reduce it. - -## How does GCore provide low latency? - -The Gcore Video Streaming receives live streams in RTMP or SRT protocols; transcodes to ABR ([adaptive bitrate](/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs#output-parameters-after-transcoding)), via CDN in LL-HLS and LL-DASH protocols. - - * LL-HLS (Low Latency HTTP Live Streaming) is an adaptive protocol developed by Apple for live streaming via the Internet. This protocol is based on HTTP, which allows it to be cached on CDN servers and distributed via CDN as static content. - * LL-DASH (Low Latency Dynamic Adaptive Streaming over HTTP) is a data streaming technology that optimizes media content delivery via the HTTP protocol. - - - -Also, Gcore uses CMAF (Common Media Application Format) as a base for LL-HLS/DASH. CMAF allows dividing segments into chunks (video fragments) for faster delivery over HTTP networks. - -LL-HLS and LL-DASH reduce latency to 2–4 sec, depending on the network conditions. - - -![How does Gcore provide low latency](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/gcore-vs-traditional-streaming.png) - - - -## How do LL-HLS and LL-DASH work in comparison to the standard approach? - -The standard video delivery approach involves sending the entirely created segment to the CDN. Once the CDN receives the complete segment, it transmits it to the player. - -With this approach, video latency depends on segment length. For example, if a segment is 6 seconds long when requesting and processing the first segment, the player displays a frame that is already 6 seconds late compared to the actual time. - -The Low Latency approach uses the CMAF-CTE extension (Chunked Transfer-Encoding), which helps divide live stream segments into small, non-overlapping, and independent fragments (chunks) with a length of 0.5–2 seconds. The independence of the chunks allows the encoder not to wait for the end of the complete loading of the segment but to send it to the CDN and the player in ready-made small fragments. - -This approach helps eliminate the segment duration factor affecting video latency in standard video delivery methods. Therefore, latency for 10-second and 2-second segments will be the same and minimal. The total latency between the CDN server and the viewers will be at most 4 seconds. - -Compared to the standard approach, a 6-second segment will be divided into 0.5-2 seconds chunks. Thus, the total latency will be lower. - - -![Example of how low latency works](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/low-latency-casino.gif) - - - -## Use low latency streaming - -We support [Low Latency streaming](https://gcore.com/news/low-latency-hls/) by default. It means your live streams are automatically transcoded to LL-HLS or LL-DASH protocol when you [create and configure a live stream](/streaming-platform/live-streaming/create-a-live-stream). - -Links for embedding the live stream to your own player contain the _/cmaf/_ part and look as follows: - - * MPEG-DASH, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/index.mpd` - * LL HLS, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/master.m3u8` - * Traditional HLS, MPEG TS (no low latency): `https://demo.gvideo.io/mpegts/2675_19146/master_mpegts.m3u8` - - - -## Switch to legacy HLS modes - -Some legacy devices or software require MPEG-TS (.ts) segments for streaming. To ensure full backward compatibility with HLS across all devices and infrastructures, we offer MPEG-TS streaming options. - -We produce low-latency and non-low-latency streams in parallel, so you don't have to create a stream specifically for cases when the connection is unstable or a device doesn't support low-latency. Both formats share the same segment sizes, manifest lengths for DVR functionality, and other related capabilities. - - -**Tip** - -For modern devices, we recommend using the HLS manifest URL (`hls_cmaf_url`). It's more efficient and is highly compatible with streaming devices. - - -You can get the non-low-latency in the same Links for export section in the Customer Portal: - -1\. On the [Video Streaming](https://portal.gcore.com/streaming/streaming/list) page, find the needed video. - -2\. In the **Links for export** section, copy the link in the **HLS non-low-latency manifest URL** field. This link contains non low-latency HLSv3 and MPEG TS files as chunks. - - -![HLS non-low-latency link example](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/export-non-low-latency-link.png) - - - +--- +title: How low latency streaming works +sidebarTitle: Low latency streaming +--- + +Streaming latency is the timespan between the moment a frame is captured and when that frame is displayed on the viewers' screens. Latency occurs because each stream is processed several times during broadcasting to be delivered worldwide: + +1\. **Encoding (or packaging).** In this step, the streaming service retrieves your stream in any format, converts it into the format for delivery through CDN, and divides it into small fragments. + +2\. **Transferring.** In this step, CDN servers pull the processed stream, cache it, and send it to the end-users. + +3\. **Receipt by players.** In this step, end-user players load the fragments and buffer them. + +Each step affects latency, so the total timespan can increase to 30–40 seconds, especially if the streaming processing isn't optimized. For some companies (such as sports or metaverse events, or news releases), such latency is too large, and it's crucial to reduce it. + +## How does GCore provide low latency? + +The Gcore Video Streaming receives live streams in RTMP or SRT protocols; transcodes to ABR ([adaptive bitrate](/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs#output-parameters-after-transcoding)), via CDN in LL-HLS and LL-DASH protocols. + + * LL-HLS (Low Latency HTTP Live Streaming) is an adaptive protocol developed by Apple for live streaming via the Internet. This protocol is based on HTTP, which allows it to be cached on CDN servers and distributed via CDN as static content. + * LL-DASH (Low Latency Dynamic Adaptive Streaming over HTTP) is a data streaming technology that optimizes media content delivery via the HTTP protocol. + + + +Also, Gcore uses CMAF (Common Media Application Format) as a base for LL-HLS/DASH. CMAF allows dividing segments into chunks (video fragments) for faster delivery over HTTP networks. + +LL-HLS and LL-DASH reduce latency to 2–4 sec, depending on the network conditions. + + +![How does Gcore provide low latency](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/gcore-vs-traditional-streaming.png) + + + +## How do LL-HLS and LL-DASH work in comparison to the standard approach? + +The standard video delivery approach involves sending the entirely created segment to the CDN. Once the CDN receives the complete segment, it transmits it to the player. + +With this approach, video latency depends on segment length. For example, if a segment is 6 seconds long when requesting and processing the first segment, the player displays a frame that is already 6 seconds late compared to the actual time. + +The Low Latency approach uses the CMAF-CTE extension (Chunked Transfer-Encoding), which helps divide live stream segments into small, non-overlapping, and independent fragments (chunks) with a length of 0.5–2 seconds. The independence of the chunks allows the encoder not to wait for the end of the complete loading of the segment but to send it to the CDN and the player in ready-made small fragments. + +This approach helps eliminate the segment duration factor affecting video latency in standard video delivery methods. Therefore, latency for 10-second and 2-second segments will be the same and minimal. The total latency between the CDN server and the viewers will be at most 4 seconds. + +Compared to the standard approach, a 6-second segment will be divided into 0.5-2 seconds chunks. Thus, the total latency will be lower. + + +![Example of how low latency works](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/low-latency-casino.gif) + + + +## Use low latency streaming + +We support [Low Latency streaming](https://gcore.com/news/low-latency-hls/) by default. It means your live streams are automatically transcoded to LL-HLS or LL-DASH protocol when you [create and configure a live stream](/streaming-platform/live-streaming/create-a-live-stream). + +Links for embedding the live stream to your own player contain the _/cmaf/_ part and look as follows: + + * MPEG-DASH, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/index.mpd` + * LL HLS, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/master.m3u8` + * Traditional HLS, MPEG TS (no low latency): `https://demo.gvideo.io/mpegts/2675_19146/master_mpegts.m3u8` + + + +## Switch to legacy HLS modes + +Some legacy devices or software require MPEG-TS (.ts) segments for streaming. To ensure full backward compatibility with HLS across all devices and infrastructures, we offer MPEG-TS streaming options. + +We produce low-latency and non-low-latency streams in parallel, so you don't have to create a stream specifically for cases when the connection is unstable or a device doesn't support low-latency. Both formats share the same segment sizes, manifest lengths for DVR functionality, and other related capabilities. + + +**Tip** + +For modern devices, we recommend using the HLS manifest URL (`hls_cmaf_url`). It's more efficient and is highly compatible with streaming devices. + + +You can get the non-low-latency in the same Links for export section in the Customer Portal: + +1\. On the [Video Streaming](https://portal.gcore.com/streaming/streaming/list) page, find the needed video. + +2\. In the **Links for export** section, copy the link in the **HLS non-low-latency manifest URL** field. This link contains non low-latency HLSv3 and MPEG TS files as chunks. + + +![HLS non-low-latency link example](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/export-non-low-latency-link.png) + + + For details on how to get the streams via API, check our [API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/get_streams). \ No newline at end of file From 5c626e16a02ea3c749590592a38079a369d49ad4 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 13:33:03 +0000 Subject: [PATCH 16/29] Documentation edits made through Mintlify web editor --- .../live-streaming/create-a-live-stream.mdx | 228 ++++++------------ 1 file changed, 76 insertions(+), 152 deletions(-) diff --git a/streaming-platform/live-streaming/create-a-live-stream.mdx b/streaming-platform/live-streaming/create-a-live-stream.mdx index 354463d9f..fec0a116a 100644 --- a/streaming-platform/live-streaming/create-a-live-stream.mdx +++ b/streaming-platform/live-streaming/create-a-live-stream.mdx @@ -1,153 +1,77 @@ ---- -title: Create a live stream -sidebarTitle: Create a live stream ---- - -## Step 1. Initiate the process - -1\. In the Gcore Customer Portal, navigate to [Streaming](https://streaming.gcore.com/streaming) > **Live Streaming**. - -2\. Click **Create Live stream**. - - -![Live stream button on the life streaming page](/images/docs/streaming-platform/live-streaming/create-a-live-stream/live-streaming-annotated.png) - - - -If the button is non-responsive, you have exceeded your live stream limit. To create a new stream, remove an existing stream from the list or request [technical support](mailto:support@gcore.com) to increase your limits. - - - -2\. Enter the name of your live stream in the window that appears and click **Create**. - - -![Enter the name of your live stream](/images/docs/streaming-platform/live-streaming/create-a-live-stream/9651635790481.png) - - - -A new page will appear. Perform the remaining steps there. - -## Step 2. Set the stream type and additional features - - -![Live stream page](/images/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-settings-push.png) - - - -1\. Make sure that the **Enable live stream** toggle is on. - - - -By default, we offer live streams with low latency (a 4–5 second delay.) Low latency is available in two protocols: LL-DASH ([compatible with all devices except iOS](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works)) and LL-HLS (compatible with iOS). You can also obtain legacy HLS with MPEGTS format segments, in which case, please read [our article](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works). - - - -2\. (Optional) Review the live stream name and update it if needed. - -3\. Enable additional features If you activated them previously: - - * [Record](/streaming-platform/live-streaming/record-your-live-streams-and-save-them-as-videos) for live stream recording. It will be active when you start streaming. Remember to enable the toggle if you require a record of your stream. - * [DVR](/streaming-platform/live-streaming/pause-and-rewind-the-live-streams) for an improved user experience. When the DVR feature is enabled, your viewers can pause and rewind the broadcast. - - - -4\. Select the relevant stream type: **Push**, **Pull**, or **WebRTC = > HLS**. - - * Choose **Push** if you don't use your own media server. Establish the URL of our server and the unique stream key in your encoder (e.g. OBS, Streamlabs, vMix, or LiveU Solo). You can use protocols RTMP, RTMPS, and SRT too. The live stream will operate on our server, will be converted to MPEG-DASH and HLS protocols, and will be distributed to end users via our CDN. - - * Choose **Pull** if you have a streaming media server. The live stream will operate on your server. Our server will convert it from the RTMP, RTMPS, SRT, or other protocols to MPEG-DASH and HLS protocols. Then, our CDN will distribute the original live stream in the new format to end users. - - * Choose **WebRTC = > HLS** if you want to convert your live video stream from WebRTC to HLS (HTTP Live Streaming) and DASH (Dynamic Adaptive Streaming over HTTP) formats. - - - - -## Step 3. Configure your stream for push, pull, or WebRTC to HLS - -### Push ingest type - -1\. Select the protocol for your stream: **RTMP**, **RTMPS**, or **SRT**. The main difference between these protocols is their security levels and ability to handle packet loss. - - * RTMP is the standard open-source protocol for live broadcasting over the internet. It supports low latency. - * RTMPS is a variation of RTMP that incorporates SSL usage. - * SRT is a protocol designed to transmit data reliably with protection against packet loss. - - -![URLs for encoder configuration](/images/docs/streaming-platform/live-streaming/create-a-live-stream/pull-ingest-encoder-urls.png) - - - -2\. Copy the relevant data to insert into your encoder. - - - -Insert the following values: - - * **Server (URL)** is the target server where your encoder will relay the broadcast; e.g., `rtmp://vp-push-ed1.gvideo.co/in/ `. - * **Stream key** is the unique identifier of the created live stream. - - - -Copy the Push URL SRT. It contains the server URL, port, stream ID (internal for Gcore,) and stream key. For example: - - ``` - srt://vp-push-ed1-srt.gvideo.co:5001?streamid=000000#12ab345c678901d… - ``` - -![SRT configuration](/images/docs/streaming-platform/live-streaming/create-a-live-stream/srt.png) - - - - - -We provide backup links, which you can specify in the encoder interface. In case of inaccessibility and overloading of your primary server, the stream will be minimally interrupted and will continue automatically from the backup server. - - - -### Pull ingest type - -In the **URL** field, insert a link to the stream from your media server. Check the full list of supported protocols in our [Input parameters](/streaming-platform/live-streams-and-videos-protocols-and-codecs/what-initial-parameters-of-your-live-streams-and-videos-we-can-accept) guide. - - -![Live streaming section](/images/docs/streaming-platform/live-streaming/create-a-live-stream/pull-ingest-type-url.png) - - -**Tip** - -You can specify multiple media servers separated by space in the URL field. - -In this case, the first media server will be the primary source, and the subsequent ones will serve as backup servers. If the signal from the first source fails, we will automatically continue the stream from the second source. For example: `rtmps://main-server/live1 rtmp://backup-server/live1 rtmp://backup-server/live2`. - - -### WebRTC to HLS ingest type - -Insert the link from the WHIP URL field to any library or tool that supports WHIP (WebRTC-HTTP Ingestion Protocol). This will convert your stream into HLS format. - - -![WebRTC to HLS settings](/images/docs/streaming-platform/live-streaming/create-a-live-stream/webrtc-hls.png) - - - -## Step 4. Start the stream - -Start a live stream on your media server or encoder. You will see a streaming preview on the Gcore Live Stream Settings page if everything is configured correctly. - -## Step 5. Embed the stream to your app - -Embed the created live stream into your web app by one of the following methods: - - * Copy the iframe code to embed the live stream within the Gcore built-in player. - * Copy the export link in a suitable protocol and paste it into your player. Use the **LL-DASH** link if your live stream will be viewed from any device except iOS. Use **LL HLS** for iOS viewing. - - -![Links for embeding them to the app](/images/docs/streaming-platform/live-streaming/create-a-live-stream/embed-to-app.png) - - - -That's it. Your viewers can see the live stream. - -{/* -**Warning** - -We only support [statistic data](/streaming/streaming-platform/how-the-streaming-platform-and-additional-features-are-billed) collection for Gcore players. If you use your own, non-Gcore player, the statistics page will be empty. Independent of the player, you can view [monitoring metrics](/streaming-platform/live-streaming/view-your-live-stream-metrics) for performance analysis and troubleshooting. +--- +title: Create a live stream +sidebarTitle: Create a live stream +--- + +# Create a live stream + +## Step 1. Initiate the process + +1\. In the **Gcore Customer Portal**, navigate to **Streaming** > [Live Streaming](https://streaming.gcore.com/streaming). + +2\. Click the **Create Live stream** button on the top right. + +![Live stream button on the life streaming page](/images/docs/streaming-platform/live-streaming/create-a-live-stream/live-streaming-annotated.png) + + +If the button is non-responsive, you have exceeded your live stream limit. To create a new stream, remove an existing stream from the list or request [technical support](mailto:support@gcore.com) to increase your limits. + + +2\. Enter the name of your live stream in the window that appears and click the **Create** button. + +![Enter the name of your live stream](/images/docs/streaming-platform/live-streaming/create-a-live-stream/9651635790481.png) + +A new page will appear. Perform the remaining steps there. + +## Step 2. Set the ingest type and additional features + +![Live stream page](/images/docs/streaming-platform/live-streaming/create-a-live-stream/live-stream-settings-push.png) + +1\. Make sure that the **Enable live stream** toggle is on. + + +By default, we offer live streams with low latency (a 4–5 second delay.) Low latency is available in two protocols: LL-DASH ([compatible with all devices except iOS](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works)) and LL-HLS (compatible with iOS). You can also obtain legacy HLS with MPEGTS format segments, in which case, please read [our article](/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works). + + +2\. Review the live stream name and update it if needed. + +3\. Enable additional features: + + * [Record](/streaming-platform/live-streaming/record-your-live-streams-and-save-them-as-videos) for live stream recording. It will be active when you start streaming. Remember to enable the toggle if you require a record of your stream. + * [DVR](/streaming-platform/live-streaming/pause-and-rewind-the-live-streams) for an improved user experience. When the DVR feature is enabled, your viewers can pause and rewind the broadcast. + +4\. Select the relevant **Ingest type**: **Push** or **Pull**. + +- Choose **Push** if you don't use your own media server. Establish the URL of our server and the unique stream key in your encoder (e.g. OBS, Streamlabs, vMix, or LiveU Solo). You can use protocols RTMP, RTMPS, and SRT too. The live stream will operate on our server, will be converted to MPEG-DASH and HLS protocols, and will be distributed to end users via our CDN. + +- Choose **Pull** if you have a streaming media server. The live stream will operate on your server. Our server will convert it from the RTMP, RTMPS, SRT, or other protocols to MPEG-DASH and HLS protocols. Then, our CDN will distribute the original live stream in the new format to end users. + +## Step 3. Configure your stream + +Depending on the selcected ingest type and protocol, your settings will differ. Refer to specific +protocol pages for more details: + +- [RTMP/RTMPS](https://gcore.com/docs/streaming-platform/live-streaming/protocols/rtmp) +- [SRT](https://gcore.com/docs/streaming-platform/live-streaming/protocols/srt) +- [WebRTC to HLS](https://gcore.com/docs/streaming-platform/live-streaming/protocols/webrtc) + +## Step 4. Start the stream + +Start a live stream on your media server or encoder. You will see a streaming preview on the **Live Stream Settings** page if everything is configured correctly. + +## Step 5. Embed the stream to your app + +Embed the created live stream into your web app by one of the following methods: + +- Copy the iframe code to embed the live stream within the Gcore built-in player. +- Copy the export link in a suitable protocol and paste it into your player. Use the **LL-DASH** link if your live stream will be viewed from any device except iOS. Use **LL HLS** for iOS viewing. + +![Links for embeding them to the app](/images/docs/streaming-platform/live-streaming/create-a-live-stream/embed-to-app.png) + +That’s it. Your viewers can see the live stream. + +{/* +**Warning** + +We only support [statistic data](/streaming/streaming-platform/how-the-streaming-platform-and-additional-features-are-billed) collection for Gcore players. If you use your own, non-Gcore player, the statistics page will be empty. Independent of the player, you can view [monitoring metrics](/streaming-platform/live-streaming/view-your-live-stream-metrics) for performance analysis and troubleshooting. */} \ No newline at end of file From 9605803f7da210212dd7442bc686c32ea300b770 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 13:33:54 +0000 Subject: [PATCH 17/29] Documentation edits made through Mintlify web editor --- .../about-gcore-streaming-platform.mdx | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/streaming-platform/about-gcore-streaming-platform.mdx b/streaming-platform/about-gcore-streaming-platform.mdx index fdd59e28f..33dd4669a 100644 --- a/streaming-platform/about-gcore-streaming-platform.mdx +++ b/streaming-platform/about-gcore-streaming-platform.mdx @@ -1,36 +1,36 @@ ---- -title: About GCore streaming platform -sidebarTitle: Overview ---- - -## Method 1: Streaming directly via CDN - -If you have your own media server that produces a stream in HLS format, you will need one CDN resource with special settings for playlists (.m3u8) and chunks (.ts). For more information about settings, see the article [Live streaming via CDN using the HLS protocol](/cdn/cdn-resource-options/configure-live-streams-and-video-delivery-via-cdn-only-for-paid-tariffs). - -You can protect the stream with a token. The token to encrypt the streaming is configured via a script on the origin server, enabling the Secure Token option in the CDN Resource settings according to the "[Configure and use Secure Token](/cdn/cdn-resource-options/security/use-a-secure-token/configure-and-use-secure-token)" guide. - -## Method 2: Streaming via the video streaming with CDN - -Use this method if a stream from your server is not in HLS format. - -Streaming via our Video Streaming has advantages and additional features, such as: - - * [Live stream recording](/streaming-platform/live-streaming/record-your-live-streams-and-save-them-as-videos) records the broadcast and saves it as VOD. - * [DVR](/streaming-platform/live-streaming/pause-and-rewind-the-live-streams) allows you to rewind the stream, stop it and return to viewing it later. - * [Restreaming](/streaming-platform/live-streaming/create-and-configure-a-restream-to-social-media) allows you to send a broadcast to several media services simultaneously, such as Facebook and YouTube. - * [Own player and statistics](/streaming-platform/extra-features/customize-appearance-of-the-built-in-player) allow you to collect statistics on views, geography, and popularity of individual broadcasts. - - - -The formats and specifications supported by the Video Streaming are described in the [article](/streaming-platform/live-streams-and-videos-protocols-and-codecs/what-initial-parameters-of-your-live-streams-and-videos-we-can-accept). - -When you stream via the Video Streaming, there are two ways to send us the stream: PUSH and PULL. - - * To use PULL, you need a server with a stream in RTMP (or other) format. The stream is sent to our servers, which convert it into HLS. - * Use PUSH if you stream directly from your computer, camera, or any other device using third-party [software](/streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs). In this case, there is a unique key in the Gcore Customer Portal that you insert into your program, and the stream is sent to us. The Video Streaming converts it into HLS and sends it to end-users. - - - -We can receive SRT streams in either PULL or PUSH format. To send us PULL-SRT, just specify a link in the required protocol in the URL field. If you want to get a PUSH link to send SRT streams to us, write to support via [support@gcore.com](mailto:support@gcore.com) or your manager. We will set up an SRT-PUSH link on your account. - +--- +title: About GCore streaming platform +sidebarTitle: Overview +--- + +## Method 1: Streaming directly via CDN + +If you have your own media server that produces a stream in HLS format, you will need one CDN resource with special settings for playlists (.m3u8) and chunks (.ts). For more information about settings, see the article [Live streaming via CDN using the HLS protocol](/cdn/cdn-resource-options/configure-live-streams-and-video-delivery-via-cdn-only-for-paid-tariffs). + +You can protect the stream with a token. The token to encrypt the streaming is configured via a script on the origin server, enabling the Secure Token option in the CDN Resource settings according to the "[Configure and use Secure Token](/cdn/cdn-resource-options/security/use-a-secure-token/configure-and-use-secure-token)" guide. + +## Method 2: Streaming via the video streaming with CDN + +Use this method if a stream from your server is not in HLS format. + +Streaming via our Video Streaming has advantages and additional features, such as: + + * [Live stream recording](/streaming-platform/live-streaming/record-your-live-streams-and-save-them-as-videos) records the broadcast and saves it as VOD. + * [DVR](/streaming-platform/live-streaming/pause-and-rewind-the-live-streams) allows you to rewind the stream, stop it and return to viewing it later. + * [Restreaming](/streaming-platform/live-streaming/create-and-configure-a-restream-to-social-media) allows you to send a broadcast to several media services simultaneously, such as Facebook and YouTube. + * [Own player and statistics](/streaming-platform/extra-features/customize-appearance-of-the-built-in-player) allow you to collect statistics on views, geography, and popularity of individual broadcasts. + + + +The formats and specifications supported by the Video Streaming are described in the [article](/streaming-platform/live-streams-and-videos-protocols-and-codecs/what-initial-parameters-of-your-live-streams-and-videos-we-can-accept). + +When you stream via the Video Streaming, there are two ways to send us the stream: PUSH and PULL. + + * To use PULL, you need a server with a stream in RTMP (or other) format. The stream is sent to our servers, which convert it into HLS. + * Use PUSH if you stream directly from your computer, camera, or any other device using third-party [software](https://gcore.com/docs/streaming-platform/live-streaming/broadcasting-software/obs). In this case, there is a unique key in the Gcore Customer Portal that you insert into your program, and the stream is sent to us. The Video Streaming converts it into HLS and sends it to end-users. + + + +We can receive SRT streams in either PULL or PUSH format. To send us PULL-SRT, just specify a link in the required protocol in the URL field. If you want to get a PUSH link to send SRT streams to us, write to support via [support@gcore.com](mailto:support@gcore.com) or your manager. We will set up an SRT-PUSH link on your account. + About PULL and PUSH in detail, you can read in the "[Create a live stream](/streaming-platform/live-streaming/create-a-live-stream)" guide (step 3.2). \ No newline at end of file From 01b993aa75329217c483e796f3a8a1253b00a172 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 12:10:24 +0000 Subject: [PATCH 18/29] Documentation edits made through Mintlify web editor --- streaming-platform/live-streaming/protocols/rtmp.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streaming-platform/live-streaming/protocols/rtmp.mdx b/streaming-platform/live-streaming/protocols/rtmp.mdx index 6107c8925..9ebefd339 100644 --- a/streaming-platform/live-streaming/protocols/rtmp.mdx +++ b/streaming-platform/live-streaming/protocols/rtmp.mdx @@ -8,7 +8,7 @@ sidebarTitle: "RTMP" The Real Time Messaging Protocol (RTMP) is the most common way to stream to video streaming platforms. Gcore Live Streaming supports both RTMP and RTMPS. - RTMP is limited to the H264 codec only. If you want to use other codecs, please [use SRT](https://gcore.com/docs/streaming-platform/live-streaming/protocols/srt) instead. + RTMP is limited to the H264 codec. If you want to use other codecs, please [use SRT](https://gcore.com/docs/streaming-platform/live-streaming/protocols/srt) instead. We plan to support H265/HVEC and other extensions from the Enhanced RTMP specification. Stay tuned for updates. From e158226ae8fe0ce578a52d5e399a326b01bd13c3 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 10:47:33 +0000 Subject: [PATCH 19/29] Documentation edits made through Mintlify web editor --- docs.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs.json b/docs.json index 3a45338e7..498298ea0 100644 --- a/docs.json +++ b/docs.json @@ -1054,7 +1054,10 @@ { "group": "Troubleshooting", "pages": [ - "streaming-platform/troubleshooting/solve-common-streaming-platform-issues", + "streaming-platform/troubleshooting/general-issues", + "streaming-platform/troubleshooting/http-status-codes", + "streaming-platform/troubleshooting/live-streaming-issues", + "streaming-platform/troubleshooting/vod-issues", { "group": "WebRTC common issues", "pages": [ From 624cba691fda9c0d9725cecf41706c3a38769911 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 10:54:07 +0000 Subject: [PATCH 20/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/live-streaming-issues.mdx | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/streaming-platform/troubleshooting/live-streaming-issues.mdx b/streaming-platform/troubleshooting/live-streaming-issues.mdx index df619c9d0..b9cc7a5af 100644 --- a/streaming-platform/troubleshooting/live-streaming-issues.mdx +++ b/streaming-platform/troubleshooting/live-streaming-issues.mdx @@ -1,34 +1,26 @@ --- -title: vod-issues -displayName: VOD issues -published: true -order: 40 -pageTitle: Solving VOD Issues | Gcore -pageDescription: An explanation of common basic checks to address issues that may arise when working with VOD. +title: "live-streaming-issues" +sidebarTitle: "Live Streaming issues" --- -# VOD issues +# Live Streaming issues -Common issues you may encounter when working with VOD, as well as steps you can take to troubleshoot them. +Common issues you may encounter when working with Live Streaming, as well as steps you can take to troubleshoot them. -## Video is not uploaded +## Low latency mode has a delay of more than 5 seconds -_Possible cause_: Upload has been interrupted by closing or reloading the window. -_Suggested solution_: Try uploading again and be careful not to interrupt the process. If the size of the video is more than 500 MB, the upload will resume where it left off. +_Possible cause_: The player does not support the DASH.JS library. +_Suggested solution_: Our low latency solution has a latency of 4-5 seconds. If the delay is more than 5 seconds: -_Possible cause_: Not enough storage space to complete the upload. -_Suggested solution_: Confirm in the Storage statistics that you have used up your storage. Contact our [support team](mailto:support@gcore.com) to increase the storage space. +- Make sure that the player supports the DASH.JS library. +- Try testing your low latency stream at the open source
DASH.JS player. -## Upload to the Gcore Customer Portal is interrupted by a session timeout (force logout) +## Current broadcast contains DVR chunks of the previous broadcast -_Possible cause_: Video is too large to upload through UI. -_Suggested solution_: +_Possible cause_: The broadcast is over, but the stream has not been stopped. +_Suggested solution_: This is a normal behavior. -- Upload during late night or early morning hours when there is less load on the queue. -- Upload a small batch of videos (e.g., 10 at a time). -- Upload via API. +To avoid this situation: -## Upload is stuck in the Processed state for a long time - -_Possible cause_: Processing queue is too long or loaded with large videos. -_Suggested solution_: Wait a while and then try uploading again. \ No newline at end of file +- Stop the stream when the broadcast is finished. +- Delete the DVR archive before starting a new broadcast. \ No newline at end of file From 200056087981db7f1400acf8c7218924aaa2db8b Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 10:55:57 +0000 Subject: [PATCH 21/29] Documentation edits made through Mintlify web editor --- streaming-platform/troubleshooting/live-streaming-issues.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/streaming-platform/troubleshooting/live-streaming-issues.mdx b/streaming-platform/troubleshooting/live-streaming-issues.mdx index b9cc7a5af..2b1ed4a2d 100644 --- a/streaming-platform/troubleshooting/live-streaming-issues.mdx +++ b/streaming-platform/troubleshooting/live-streaming-issues.mdx @@ -1,10 +1,8 @@ --- -title: "live-streaming-issues" +title: "Live Streaming issues" sidebarTitle: "Live Streaming issues" --- -# Live Streaming issues - Common issues you may encounter when working with Live Streaming, as well as steps you can take to troubleshoot them. ## Low latency mode has a delay of more than 5 seconds From b78a52d9b73027ccbb840b7b320fab9b73c4be58 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 10:56:34 +0000 Subject: [PATCH 22/29] Documentation edits made through Mintlify web editor --- .../troubleshooting/general-issues.mdx | 3 - .../troubleshooting/http-status-codes.mdx | 2 - ...-bluetooth-headsets-in-video-call-apps.mdx | 58 +++++++++---------- .../troubleshooting/vod-issues.mdx | 2 - 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/streaming-platform/troubleshooting/general-issues.mdx b/streaming-platform/troubleshooting/general-issues.mdx index 95e56b9b5..554a966cc 100644 --- a/streaming-platform/troubleshooting/general-issues.mdx +++ b/streaming-platform/troubleshooting/general-issues.mdx @@ -3,9 +3,6 @@ title: General video streaming issues sidebarTitle: General issues --- - -# General Video Streaming Issues - Common issues you may encounter when working with both Live and VOD streams, as well as steps you can take to troubleshoot them. diff --git a/streaming-platform/troubleshooting/http-status-codes.mdx b/streaming-platform/troubleshooting/http-status-codes.mdx index 54b9a1cb2..2146986f1 100644 --- a/streaming-platform/troubleshooting/http-status-codes.mdx +++ b/streaming-platform/troubleshooting/http-status-codes.mdx @@ -3,8 +3,6 @@ title: Video streaming HTTP status codes sidebarTitle: HTTP status codes --- -# Video Streaming HTTP Status Codes - The following table includes all possible HTTP status codes returned when requesting videos and live streams for manifests (e.g., .m3u8 and .mpd) or chunks (e.g., .ts, .mp4, etc.). | Code | Status | Description | diff --git a/streaming-platform/troubleshooting/real-time-video-issues/audio-quality-is-reduced-when-using-bluetooth-headsets-in-video-call-apps.mdx b/streaming-platform/troubleshooting/real-time-video-issues/audio-quality-is-reduced-when-using-bluetooth-headsets-in-video-call-apps.mdx index c3736ca3c..2d09a2bb7 100644 --- a/streaming-platform/troubleshooting/real-time-video-issues/audio-quality-is-reduced-when-using-bluetooth-headsets-in-video-call-apps.mdx +++ b/streaming-platform/troubleshooting/real-time-video-issues/audio-quality-is-reduced-when-using-bluetooth-headsets-in-video-call-apps.mdx @@ -1,31 +1,29 @@ ---- -title: Audio quality is reduced when using bluetooth headsets in video call apps -sidebarTitle: Bad audio while bluetooth mic ---- - -## Overview - -If you listen to high-quality audio content such as music with Bluetooth headphones and then open an application that uses the Bluetooth headphones' microphone, e.g., Zoom or Microsoft Team, and so on, the audio quality may be reduced, or some unconventional popping sounds may appear. The problem is that high-quality audio has been changed to low-quality audio. This problem isn't connected to the concrete application—it occurs because of Bluetooth technology in general and its audio profiles' limitations. - -## What are bluetooth's audio profiles? - -A Bluetooth audio profile is a set of standards that define how Bluetooth devices exchange audio data. Bluetooth supports several different audio profiles designed for different types of audio applications. The most common Bluetooth audio profiles are: - - * **Advanced Audio Distribution Profile (A2DP)**. This profile is intended for high-quality stereo playback. - * **Headset Profile (HSP)/Hands-Free Profile (HFP)**. This profile is meant for calls. It allows phone calls to be controlled wirelessly using the headset's own microphone and speaker. - - - -More available audio profiles are listed in the [official specification base](https://www.bluetooth.com/specifications/specs/). - -## How do bluetooth audio profiles cause a decrease in sound quality? - -The limitations of Bluetooth's audio profiles cause the problem with audio quality degradation. Bluetooth headsets can only use one audio profile at a time. - -So, when you open a video call application with a Bluetooth headset, the A2DP profile (high sound quality but no microphone capability) is replaced by the HSP/HFP profile (headphones and microphone capability but low sound quality). So, the high-quality audio is changed to low-quality. - -## Recommendations for solving the problem - -1\. Switch to wired headphone use. - +--- +title: Audio quality is reduced when using bluetooth headsets in video call apps +sidebarTitle: Bad audio while bluetooth mic +--- + +If you listen to high-quality audio content such as music with Bluetooth headphones and then open an application that uses the Bluetooth headphones' microphone, e.g., Zoom or Microsoft Team, and so on, the audio quality may be reduced, or some unconventional popping sounds may appear. The problem is that high-quality audio has been changed to low-quality audio. This problem isn't connected to the concrete application—it occurs because of Bluetooth technology in general and its audio profiles' limitations. + +## What are bluetooth's audio profiles? + +A Bluetooth audio profile is a set of standards that define how Bluetooth devices exchange audio data. Bluetooth supports several different audio profiles designed for different types of audio applications. The most common Bluetooth audio profiles are: + + * **Advanced Audio Distribution Profile (A2DP)**. This profile is intended for high-quality stereo playback. + * **Headset Profile (HSP)/Hands-Free Profile (HFP)**. This profile is meant for calls. It allows phone calls to be controlled wirelessly using the headset's own microphone and speaker. + + + +More available audio profiles are listed in the [official specification base](https://www.bluetooth.com/specifications/specs/). + +## How do bluetooth audio profiles cause a decrease in sound quality? + +The limitations of Bluetooth's audio profiles cause the problem with audio quality degradation. Bluetooth headsets can only use one audio profile at a time. + +So, when you open a video call application with a Bluetooth headset, the A2DP profile (high sound quality but no microphone capability) is replaced by the HSP/HFP profile (headphones and microphone capability but low sound quality). So, the high-quality audio is changed to low-quality. + +## Recommendations for solving the problem + +1\. Switch to wired headphone use. + 2\. Change the audio input source from the Bluetooth headset microphone to, for example, the built-in microphone of a laptop or smartphone. The A2DP audio profile will be activated, and the sound quality will be recovered. \ No newline at end of file diff --git a/streaming-platform/troubleshooting/vod-issues.mdx b/streaming-platform/troubleshooting/vod-issues.mdx index a173f1d53..993836223 100644 --- a/streaming-platform/troubleshooting/vod-issues.mdx +++ b/streaming-platform/troubleshooting/vod-issues.mdx @@ -3,8 +3,6 @@ title: "VOD issues" sidebarTitle: "VOD issues" --- -# VOD issues - Here are some common issues you may encounter when working with VOD and steps you can take to troubleshoot them. ## Video is not uploaded From 7c0c4dadc841472f1b15ae5b216374e2903563aa Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 11:04:45 +0000 Subject: [PATCH 23/29] Documentation edits made through Mintlify web editor --- docs.json | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs.json b/docs.json index 498298ea0..51a0a762d 100644 --- a/docs.json +++ b/docs.json @@ -978,23 +978,32 @@ ] }, "streaming-platform/how-the-streaming-platform-interact-with-the-cdn", - { + { "group": "Live streaming", "pages": [ "streaming-platform/live-streaming/create-a-live-stream", - "streaming-platform/live-streaming/webrtc-to-hls-transcoding", { - "group": "Push live streams software", + "group": "Broadcasting software", + "pages": [ + "streaming-platform/live-streaming/broadcasting-software/ffmpeg", + "streaming-platform/live-streaming/broadcasting-software/larix", + "streaming-platform/live-streaming/broadcasting-software/obs" + ] + }, + { + "group": "Protocols", "pages": [ - "streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-obs", - "streaming-platform/live-streaming/push-live-streams-software/push-live-streams-via-liveu-solo" + "streaming-platform/live-streaming/protocols/rtmp", + "streaming-platform/live-streaming/protocols/srt", + "streaming-platform/live-streaming/protocols/webrtc" ] }, "streaming-platform/live-streaming/create-and-configure-a-restream-to-social-media", "streaming-platform/live-streaming/combine-multiple-live-streams", "streaming-platform/live-streaming/record-your-live-streams-and-save-them-as-videos", "streaming-platform/live-streaming/pause-and-rewind-the-live-streams", - "streaming-platform/live-streaming/insert-html-overlays-in-live-streams" + "streaming-platform/live-streaming/insert-html-overlays-in-live-streams", + "streaming-platform/live-streaming/how-low-latency-streaming-works" ] }, { From a01a8472e7be11169ad79df521bc4d10bd71b453 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 11:08:54 +0000 Subject: [PATCH 24/29] Documentation edits made through Mintlify web editor --- .../live-streaming/broadcasting-software/ffmpeg.mdx | 2 -- .../live-streaming/broadcasting-software/larix.mdx | 2 -- streaming-platform/live-streaming/broadcasting-software/obs.mdx | 2 -- streaming-platform/live-streaming/create-a-live-stream.mdx | 2 -- streaming-platform/live-streaming/protocols/rtmp.mdx | 2 -- streaming-platform/live-streaming/protocols/srt.mdx | 2 -- 6 files changed, 12 deletions(-) diff --git a/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx b/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx index 641fac377..96f0878dd 100644 --- a/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx +++ b/streaming-platform/live-streaming/broadcasting-software/ffmpeg.mdx @@ -3,8 +3,6 @@ title: "FFmpeg" sidebarTitle: "FFmpeg" --- -# FFmpeg - FFmpeg is a free and open-source command-line tool for recording, screencasting, and live streaming. It’s suitable for video game streaming, blogging, educational content, and more. FFmpeg links your device (e.g, a laptop or a PC) to different streaming platforms (e.g., Gcore Video Streaming, YouTube, Twitch, etc.). It takes an image captured by a camera, converts it into a video stream, and then sends it to the streaming platform. diff --git a/streaming-platform/live-streaming/broadcasting-software/larix.mdx b/streaming-platform/live-streaming/broadcasting-software/larix.mdx index 3dca7fe60..deb4aa5c9 100644 --- a/streaming-platform/live-streaming/broadcasting-software/larix.mdx +++ b/streaming-platform/live-streaming/broadcasting-software/larix.mdx @@ -3,8 +3,6 @@ title: "Larix" sidebarTitle: "Larix" --- -# Larix - Larix is a free video recording, screencasting, and live streaming encoder. It’s suitable for video game streaming, blogging, educational content, and more. Larix links your mobile device (e.g., a smartphone or a tablet) to different streaming platforms (e.g., Gcore Video Streaming, YouTube, Twitch, etc.). It takes an image captured by a camera, converts it into a video stream, and then sends it to the streaming platform. diff --git a/streaming-platform/live-streaming/broadcasting-software/obs.mdx b/streaming-platform/live-streaming/broadcasting-software/obs.mdx index 1be600be0..f988582f7 100644 --- a/streaming-platform/live-streaming/broadcasting-software/obs.mdx +++ b/streaming-platform/live-streaming/broadcasting-software/obs.mdx @@ -3,8 +3,6 @@ title: "Open Broadcaster Software" sidebarTitle: "OBS" --- -# Open Broadcaster Software - Open Broadcaster Software (OBS) is a free and open-source encoder for video recording, screencasting, and live streaming. It’s suitable for video game streaming, blogging, educational content, and more. OBS links your device (a laptop or a PC) to different streaming platforms (Gcore Video Streaming, YouTube, Twitch, etc.). It takes a camera image, converts it into a video stream, and then sends it to the streaming platform. diff --git a/streaming-platform/live-streaming/create-a-live-stream.mdx b/streaming-platform/live-streaming/create-a-live-stream.mdx index fec0a116a..0c7d51406 100644 --- a/streaming-platform/live-streaming/create-a-live-stream.mdx +++ b/streaming-platform/live-streaming/create-a-live-stream.mdx @@ -3,8 +3,6 @@ title: Create a live stream sidebarTitle: Create a live stream --- -# Create a live stream - ## Step 1. Initiate the process 1\. In the **Gcore Customer Portal**, navigate to **Streaming** > [Live Streaming](https://streaming.gcore.com/streaming). diff --git a/streaming-platform/live-streaming/protocols/rtmp.mdx b/streaming-platform/live-streaming/protocols/rtmp.mdx index 9ebefd339..c8eb268fa 100644 --- a/streaming-platform/live-streaming/protocols/rtmp.mdx +++ b/streaming-platform/live-streaming/protocols/rtmp.mdx @@ -3,8 +3,6 @@ title: "The Real Time Messaging Protocol" sidebarTitle: "RTMP" --- -# The Real Time Messaging Protocol - The Real Time Messaging Protocol (RTMP) is the most common way to stream to video streaming platforms. Gcore Live Streaming supports both RTMP and RTMPS. diff --git a/streaming-platform/live-streaming/protocols/srt.mdx b/streaming-platform/live-streaming/protocols/srt.mdx index 04ed97d5b..b019abcd0 100644 --- a/streaming-platform/live-streaming/protocols/srt.mdx +++ b/streaming-platform/live-streaming/protocols/srt.mdx @@ -3,8 +3,6 @@ title: "The Secure Reliable Transport Protocol" sidebarTitle: "SRT" --- -# The Secure Reliable Transport Protocol - Secure Reliable Transport (SRT) is an open-source streaming protocol that solves some of the limitations of RTMP delivery. In contrast to RTMP/RTMPS, SRT is a UDP-based protocol that provides low-latency streaming over unpredictable networks. On Gcore Video Streaming, SRT is also required if you want to use the H265/HVEC codec. ## Push streams From 2c1673360b5ae603a08f933ba84c6f6eb7f8cb61 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 11:14:44 +0000 Subject: [PATCH 25/29] Documentation edits made through Mintlify web editor --- streaming-platform/live-streaming/create-a-live-stream.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/streaming-platform/live-streaming/create-a-live-stream.mdx b/streaming-platform/live-streaming/create-a-live-stream.mdx index 0c7d51406..a65b76256 100644 --- a/streaming-platform/live-streaming/create-a-live-stream.mdx +++ b/streaming-platform/live-streaming/create-a-live-stream.mdx @@ -49,9 +49,9 @@ By default, we offer live streams with low latency (a 4–5 second delay.) Low l Depending on the selcected ingest type and protocol, your settings will differ. Refer to specific protocol pages for more details: -- [RTMP/RTMPS](https://gcore.com/docs/streaming-platform/live-streaming/protocols/rtmp) -- [SRT](https://gcore.com/docs/streaming-platform/live-streaming/protocols/srt) -- [WebRTC to HLS](https://gcore.com/docs/streaming-platform/live-streaming/protocols/webrtc) +- [RTMP/RTMPS](protocols/rtmp) +- [SRT](protocols/srt) +- [WebRTC to HLS](protocols/webrtc) ## Step 4. Start the stream From cc09245167c2f6915b307ba8491694ea78cc754b Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 11:17:26 +0000 Subject: [PATCH 26/29] Documentation edits made through Mintlify web editor --- .../live-streaming/broadcasting-software/larix.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streaming-platform/live-streaming/broadcasting-software/larix.mdx b/streaming-platform/live-streaming/broadcasting-software/larix.mdx index deb4aa5c9..fd7b154d3 100644 --- a/streaming-platform/live-streaming/broadcasting-software/larix.mdx +++ b/streaming-platform/live-streaming/broadcasting-software/larix.mdx @@ -39,7 +39,7 @@ You can adjust these settings with [Larix Grove](https://softvelum.com/larix/gro After you have changed the settings, click the **QR-Code** button to generate a new QR code for sharing. -![Larix Grove Pn](/images/larix-grove.png) +![Larix Grove Pn](/images/docs/streaming-platform/live-streaming/larix-grove.png) ### Camera parameters From cf1922ae7aca80818de8800dd31bc9d6e88bf399 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 11:22:03 +0000 Subject: [PATCH 27/29] Documentation edits made through Mintlify web editor --- .../live-streaming/broadcasting-software/larix.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streaming-platform/live-streaming/broadcasting-software/larix.mdx b/streaming-platform/live-streaming/broadcasting-software/larix.mdx index fd7b154d3..deb4aa5c9 100644 --- a/streaming-platform/live-streaming/broadcasting-software/larix.mdx +++ b/streaming-platform/live-streaming/broadcasting-software/larix.mdx @@ -39,7 +39,7 @@ You can adjust these settings with [Larix Grove](https://softvelum.com/larix/gro After you have changed the settings, click the **QR-Code** button to generate a new QR code for sharing. -![Larix Grove Pn](/images/docs/streaming-platform/live-streaming/larix-grove.png) +![Larix Grove Pn](/images/larix-grove.png) ### Camera parameters From 4947f578ed8371a363dc4fee18d51e611bca82f6 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 11:31:28 +0000 Subject: [PATCH 28/29] Documentation edits made through Mintlify web editor --- streaming-platform/troubleshooting/general-issues.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streaming-platform/troubleshooting/general-issues.mdx b/streaming-platform/troubleshooting/general-issues.mdx index 554a966cc..4d54d2b6a 100644 --- a/streaming-platform/troubleshooting/general-issues.mdx +++ b/streaming-platform/troubleshooting/general-issues.mdx @@ -6,7 +6,7 @@ sidebarTitle: General issues Common issues you may encounter when working with both Live and VOD streams, as well as steps you can take to troubleshoot them. - If you encounter problems specific to live streaming or VOD uploads, please refer to the [Live streaming issues](https://gcore.com/docs/streaming-platform/live-streaming/troubleshooting/live-streaming-issues) or [VOD issues](https://gcore.com/docs/streaming-platform/live-streaming/troubleshooting/vod-issues) pages. + If you encounter problems specific to live streaming or VOD uploads, please refer to the [Live streaming issues](live-streaming-issues) or [VOD issues](vod-issues) pages. ## General troubleshooting steps From c211b16cf16cc83e81db8fdbb4a3227e07e233e9 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:33:03 +0000 Subject: [PATCH 29/29] Documentation edits made through Mintlify web editor --- .../how-low-latency-streaming-works.mdx | 63 +++++++++---------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/streaming-platform/live-streaming/how-low-latency-streaming-works.mdx b/streaming-platform/live-streaming/how-low-latency-streaming-works.mdx index a855eacc9..b176eed7d 100644 --- a/streaming-platform/live-streaming/how-low-latency-streaming-works.mdx +++ b/streaming-platform/live-streaming/how-low-latency-streaming-works.mdx @@ -1,39 +1,36 @@ --- -title: How low latency streaming works -sidebarTitle: Low latency streaming +title: "How low latency streaming works" +sidebarTitle: "Low latency streaming" --- Streaming latency is the timespan between the moment a frame is captured and when that frame is displayed on the viewers' screens. Latency occurs because each stream is processed several times during broadcasting to be delivered worldwide: -1\. **Encoding (or packaging).** In this step, the streaming service retrieves your stream in any format, converts it into the format for delivery through CDN, and divides it into small fragments. +1. **Encoding (or packaging).** In this step, the streaming service retrieves your stream in any format, converts it into the format for delivery through CDN, and divides it into small fragments. -2\. **Transferring.** In this step, CDN servers pull the processed stream, cache it, and send it to the end-users. +2. **Transferring.** In this step, CDN servers pull the processed stream, cache it, and send it to the end-users. -3\. **Receipt by players.** In this step, end-user players load the fragments and buffer them. +3. **Receipt by players.** In this step, end-user players load the fragments and buffer them. Each step affects latency, so the total timespan can increase to 30–40 seconds, especially if the streaming processing isn't optimized. For some companies (such as sports or metaverse events, or news releases), such latency is too large, and it's crucial to reduce it. -## How does GCore provide low latency? +## How does Gcore provide low latency? The Gcore Video Streaming receives live streams in RTMP or SRT protocols; transcodes to ABR ([adaptive bitrate](/streaming-platform/live-streams-and-videos-protocols-and-codecs/output-parameters-after-transcoding-bitrate-frame-rate-and-codecs#output-parameters-after-transcoding)), via CDN in LL-HLS and LL-DASH protocols. - * LL-HLS (Low Latency HTTP Live Streaming) is an adaptive protocol developed by Apple for live streaming via the Internet. This protocol is based on HTTP, which allows it to be cached on CDN servers and distributed via CDN as static content. - * LL-DASH (Low Latency Dynamic Adaptive Streaming over HTTP) is a data streaming technology that optimizes media content delivery via the HTTP protocol. - - +- LL-HLS (Low Latency HTTP Live Streaming) is an adaptive protocol developed by Apple for live streaming via the Internet. This protocol is based on HTTP, which allows it to be cached on CDN servers and distributed via CDN as static content. +- LL-DASH (Low Latency Dynamic Adaptive Streaming over HTTP) is a data streaming technology that optimizes media content delivery via the HTTP protocol. Also, Gcore uses CMAF (Common Media Application Format) as a base for LL-HLS/DASH. CMAF allows dividing segments into chunks (video fragments) for faster delivery over HTTP networks. LL-HLS and LL-DASH reduce latency to 2–4 sec, depending on the network conditions. - -![How does Gcore provide low latency](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/gcore-vs-traditional-streaming.png) - - + + ![How does Gcore provide low latency](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/gcore-vs-traditional-streaming.png) + ## How do LL-HLS and LL-DASH work in comparison to the standard approach? -The standard video delivery approach involves sending the entirely created segment to the CDN. Once the CDN receives the complete segment, it transmits it to the player. +The standard video delivery approach involves sending the entirely created segment to the CDN. Once the CDN receives the complete segment, it transmits it to the player. With this approach, video latency depends on segment length. For example, if a segment is 6 seconds long when requesting and processing the first segment, the player displays a frame that is already 6 seconds late compared to the actual time. @@ -43,10 +40,9 @@ This approach helps eliminate the segment duration factor affecting video latenc Compared to the standard approach, a 6-second segment will be divided into 0.5-2 seconds chunks. Thus, the total latency will be lower. - -![Example of how low latency works](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/low-latency-casino.gif) - - + + ![Example of how low latency works](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/low-latency-casino.gif) + ## Use low latency streaming @@ -54,33 +50,30 @@ We support [Low Latency streaming](https://gcore.com/news/low-latency-hls/) by d Links for embedding the live stream to your own player contain the _/cmaf/_ part and look as follows: - * MPEG-DASH, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/index.mpd` - * LL HLS, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/master.m3u8` - * Traditional HLS, MPEG TS (no low latency): `https://demo.gvideo.io/mpegts/2675_19146/master_mpegts.m3u8` - - +- MPEG-DASH, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/index.mpd` +- LL HLS, CMAF (low latency): `https://demo.gvideo.io/cmaf/2675_19146/master.m3u8` +- Traditional HLS, MPEG TS (no low latency): `https://demo.gvideo.io/mpegts/2675_19146/master_mpegts.m3u8` ## Switch to legacy HLS modes -Some legacy devices or software require MPEG-TS (.ts) segments for streaming. To ensure full backward compatibility with HLS across all devices and infrastructures, we offer MPEG-TS streaming options. +Some legacy devices or software require MPEG-TS (.ts) segments for streaming. To ensure full backward compatibility with HLS across all devices and infrastructures, we offer MPEG-TS streaming options. -We produce low-latency and non-low-latency streams in parallel, so you don't have to create a stream specifically for cases when the connection is unstable or a device doesn't support low-latency. Both formats share the same segment sizes, manifest lengths for DVR functionality, and other related capabilities. +We produce low-latency and non-low-latency streams in parallel, so you don't have to create a stream specifically for cases when the connection is unstable or a device doesn't support low-latency. Both formats share the same segment sizes, manifest lengths for DVR functionality, and other related capabilities. -**Tip** + **Tip** -For modern devices, we recommend using the HLS manifest URL (`hls_cmaf_url`). It's more efficient and is highly compatible with streaming devices. + For modern devices, we recommend using the HLS manifest URL (`hls_cmaf_url`). It's more efficient and is highly compatible with streaming devices. -You can get the non-low-latency in the same Links for export section in the Customer Portal: - -1\. On the [Video Streaming](https://portal.gcore.com/streaming/streaming/list) page, find the needed video. - -2\. In the **Links for export** section, copy the link in the **HLS non-low-latency manifest URL** field. This link contains non low-latency HLSv3 and MPEG TS files as chunks. - +You can get the non-low-latency in the same Links for export section in the Customer Portal: -![HLS non-low-latency link example](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/export-non-low-latency-link.png) +1. On the [Video Streaming](https://portal.gcore.com/streaming/streaming/list) page, find the needed video. +2. In the **Links for export** section, copy the link in the **HLS non-low-latency manifest URL** field. This link contains non low-latency HLSv3 and MPEG TS files as chunks. + + ![HLS non-low-latency link example](/images/docs/streaming-platform/live-streams-and-videos-protocols-and-codecs/how-low-latency-streaming-works/export-non-low-latency-link.png) + For details on how to get the streams via API, check our [API documentation](https://api.gcore.com/docs/streaming#tag/Streams/operation/get_streams). \ No newline at end of file