jellyfin / jellyfin-tizen

Jellyfin Samsung TV Client
https://jellyfin.org
863 stars 69 forks source link

Video playback failure/freeze when played with lower bitrate #105

Open RTUnit opened 2 years ago

RTUnit commented 2 years ago

Playback freezes (fails with error in console log) after decreasing bitrate in Jellyfin app.

Media original bitrate is 43149001 (1080p H264 SDR, 8 bit, 1920x1080, MKV). If I set the Network Quality in Jellyfin app Playback settings below the media bitrate (eg, 20Mbps / 20000000) then playback freezes after pressing Play button. If using Auto, or higher bitrate setting then playback is without error. The error is not replicating if playing the same media with lower bitrate in Browser app on Tizen TV pointing to Jellyfin Web Server.

When debugging the app I notice this error in Console Log: media element error: 0 (above error originates in htmlVideoPlayer plugin onError handler here)

Jellyfin media server is version 10.8.0-alpha5 Jellyfin Tizen app was built using jellyfin-web downloaded on 7-Feb 2022 (https://github.com/jellyfin/jellyfin-web.git) Samsung TV (Tizen OS) 32J6300 firmware version 1520

Transcoding is using NVENC with GTX1050TI video card. There is log entry in Jellyfin server when the bitrate on TV is lower than media bitrate (but I assume this is normal): [2022-02-15 17:15:58.190 +00:00] [DBG] [51] Jellyfin.Api.Helpers.MediaInfoHelper: Bitrate exceeds DirectStream limit: media bitrate: 43149001, max bitrate: 20000000

RTUnit commented 2 years ago

I tried to debug step by step, but I cannot get to the place where error originates (there is endless loop of microtasks). Also I tried to set a higher bitrate (eg, 60 Mbps / 60000000) in PlaybackManager function getPlaybackMediaSource here playerData.maxStreamingBitrate = 60000000;, however it does not avoid the error either. I would be glad to try out some suggestions where else to apply the bitrate or other settings during debug to try eliminate the error.

dmitrylyzo commented 2 years ago

You limit the bitrate to 20Mbps, but you are trying playerData.maxStreamingBitrate = 60000000 :confused:

I cannot get to the place where error originates

media element error: 0 comes from HTMLVideoElement: https://github.com/jellyfin/jellyfin-web/blob/1e6c3edf7e40ca5a4de701ec732d0ed7494e29e4/src/components/htmlMediaHelper.js#L195 https://github.com/jellyfin/jellyfin-web/blob/1e6c3edf7e40ca5a4de701ec732d0ed7494e29e4/src/components/htmlMediaHelper.js#L220

Why is it 0? Probably because the old WebKit is a very weird web engine. https://developer.mozilla.org/en-US/docs/Web/API/MediaError

I believe it has no effect: https://github.com/jellyfin/jellyfin-web/blob/1e6c3edf7e40ca5a4de701ec732d0ed7494e29e4/src/plugins/htmlVideoPlayer/plugin.js#L941

Since limiting the bitrate causes transcoding, look at the ffmpeg logs. Also, look at the Network tab when debugging TV - maybe some requests stall/fail.

RTUnit commented 2 years ago

Thank you for suggestions.

You limit the bitrate to 20Mbps, but you are trying playerData.maxStreamingBitrate = 60000000 😕

I had assumption that playback is failing due to bitrate setting - when bitrate is high enough then it is playing just fine. Perhaps the

It is not clear why the error is triggered, however what concerns me is that transcoding is not launched when the client bitrate is smaller than media bitrate. The client is expecting transcoded video, but server is pushing original stream.

Here is server log from successful playback with transcoding - I think it was tried using Browser app on Tizen TV:

[2022-02-15 20:48:07.006 +00:00] [INF] [112] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "DaniilaTV". EnablePlaybackRemuxing: False EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2022-02-15 20:48:07.007 +00:00] [DBG] [112] Jellyfin.Api.Helpers.MediaInfoHelper: Bitrate exceeds DirectStream limit: media bitrate: 43149001, max bitrate: 20000000 [2022-02-15 20:48:07.007 +00:00] [DBG] [112] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", Path: "/media/4K/Хищник 1987.mkv", isEligibleForDirectPlay: True, isEligibleForDirectStream: False [2022-02-15 20:48:07.007 +00:00] [INF] [112] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 3000000, RemoteIp: "192.168.2.137", IsInLocalNetwork: True [2022-02-15 20:48:07.007 +00:00] [DBG] [112] Jellyfin.Api.Helpers.MediaInfoHelper: Bitrate exceeds DirectStream limit: media bitrate: 43149001, max bitrate: 20000000 [2022-02-15 20:48:07.007 +00:00] [DBG] [112] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", Path: "/media/4K/Хищник 1987.mkv", isEligibleForDirectPlay: True, isEligibleForDirectStream: False [2022-02-15 20:48:08.566 +00:00] [DBG] [112] Emby.Server.Implementations.HttpServer.WebSocketConnection: WS "192.168.2.75" received message: WebSocketMessage 1 { MessageType: KeepAlive, MessageId: 00000000-0000-0000-0000-000000000000, ServerId: null, Data: null } [2022-02-15 20:48:08.572 +00:00] [DBG] [88] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:08.573 +00:00] [DBG] [88] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.448 +00:00] [DBG] [95] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.448 +00:00] [DBG] [95] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.477 +00:00] [DBG] [88] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.477 +00:00] [DBG] [88] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.536 +00:00] [DBG] [113] Jellyfin.Api.Helpers.TranscodingJobHelper: PingTranscodingJob PlaySessionId="946ec4f41c2c42f89e2eacfea3c5434c" isUsedPaused: False [2022-02-15 20:48:10.743 +00:00] [DBG] [95] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was not authenticated. [2022-02-15 20:48:10.871 +00:00] [DBG] [95] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.871 +00:00] [DBG] [95] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.904 +00:00] [DBG] [112] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:10.904 +00:00] [DBG] [112] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:11.370 +00:00] [DBG] [191] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:11.370 +00:00] [DBG] [191] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-15 20:48:11.372 +00:00] [DBG] [191] Jellyfin.Api.Controllers.DynamicHlsController: Starting transcoding because currentTranscodingIndex=null [2022-02-15 20:48:11.373 +00:00] [INF] [191] Jellyfin.Api.Helpers.TranscodingJobHelper: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-init_hw_device cuda=cu:0 -filter_hw_device cu -extra_hw_frames 3 -hwaccel cuda -hwaccel_output_format cuda -autorotate 0 -i file:\"/media/4K/Хищник 1987.mkv\" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_nvenc -preset default -b:v 19360000 -maxrate 19360000 -bufsize 38720000 -profile:v:0 high -g:v:0 72 -keyint_min:v:0 72 -sc_threshold:v:0 0 -vf \"setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale_cuda=format=yuv420p\" -codec:a:0 aac -ac 6 -ab 640000 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_segment_filename \"/config/transcodes/6eca93ce0221681a4ce29c2f499ecb78%d.ts\" -hls_playlist_type vod -hls_list_size 0 -y \"/config/transcodes/6eca93ce0221681a4ce29c2f499ecb78.m3u8\"" [2022-02-15 20:48:11.375 +00:00] [DBG] [113] Jellyfin.Api.Helpers.TranscodingJobHelper: Launched FFmpeg process

Here is server log from unsuccesful playback where transcoding is not triggered:

[2022-02-16 16:06:10.265 +00:00] [INF] [91] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "DaniilaTV". EnablePlaybackRemuxing: False EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2022-02-16 16:06:10.265 +00:00] [DBG] [91] Jellyfin.Api.Helpers.MediaInfoHelper: Bitrate exceeds DirectStream limit: media bitrate: 43149001, max bitrate: 20000000 [2022-02-16 16:06:10.265 +00:00] [DBG] [91] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", Path: "/media/4K/Хищник 1987.mkv", isEligibleForDirectPlay: True, isEligibleForDirectStream: False [2022-02-16 16:06:10.265 +00:00] [INF] [91] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 3000000, RemoteIp: "192.168.2.137", IsInLocalNetwork: True [2022-02-16 16:06:10.265 +00:00] [DBG] [91] Jellyfin.Api.Helpers.MediaInfoHelper: Bitrate exceeds DirectStream limit: media bitrate: 43149001, max bitrate: 20000000 [2022-02-16 16:06:10.265 +00:00] [DBG] [91] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", Path: "/media/4K/Хищник 1987.mkv", isEligibleForDirectPlay: True, isEligibleForDirectStream: False [2022-02-16 16:06:14.644 +00:00] [DBG] [24] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was not authenticated. [2022-02-16 16:06:15.582 +00:00] [DBG] [45] Emby.Server.Implementations.Session.SessionWebSocketListener: Watching 1 WebSockets. [2022-02-16 16:06:15.678 +00:00] [DBG] [24] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was not authenticated. [2022-02-16 16:06:27.583 +00:00] [DBG] [24] Emby.Server.Implementations.Session.SessionWebSocketListener: Watching 1 WebSockets. [2022-02-16 16:06:38.756 +00:00] [DBG] [59] Emby.Server.Implementations.HttpServer.WebSocketConnection: WS "192.168.2.75" received message: WebSocketMessage 1 { MessageType: KeepAlive, MessageId: 00000000-0000-0000-0000-000000000000, ServerId: null, Data: null } [2022-02-16 16:06:39.582 +00:00] [DBG] [91] Emby.Server.Implementations.Session.SessionWebSocketListener: Watching 1 WebSockets. [2022-02-16 16:06:44.532 +00:00] [DBG] [94] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-16 16:06:44.532 +00:00] [DBG] [94] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-16 16:06:45.545 +00:00] [DBG] [91] Jellyfin.Api.Helpers.TranscodingJobHelper: PingTranscodingJob PlaySessionId="e9e4306b8d5f4b058315418fe718598e" isUsedPaused: False [2022-02-16 16:06:45.763 +00:00] [DBG] [59] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was not authenticated. [2022-02-16 16:06:46.474 +00:00] [DBG] [91] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-16 16:06:46.474 +00:00] [DBG] [91] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated. [2022-02-16 16:06:46.490 +00:00] [DBG] [91] Jellyfin.Api.Helpers.TranscodingJobHelper: PingTranscodingJob PlaySessionId="e9e4306b8d5f4b058315418fe718598e" isUsedPaused: False [2022-02-16 16:06:47.490 +00:00] [DBG] [103] Jellyfin.Api.Helpers.TranscodingJobHelper: PingTranscodingJob PlaySessionId="e9e4306b8d5f4b058315418fe718598e" isUsedPaused: False

For now I think that the easiest way of sorting out the problem for my personal needs is to force transcoding to happen always for this particular client (Tizen TV). But so far I have not found a setting that can achieve it. if I could find it and hard-code it in the app itself then that would solve my problem.

dmitrylyzo commented 2 years ago

when bitrate is high enough then it is playing just fine.

When bitrate is high enough, it plays Direct playing (not streaming), right? If it plays fine and you are not limited by network bandwidth then this is the best option.

It is not clear why the error is triggered

If you are talking about media element error: 0, I think you can consider it a quirk of WebKit. It has no effect due to the mentioned return.

however what concerns me is that transcoding is not launched when the client bitrate is smaller than media bitrate. The client is expecting transcoded video, but server is pushing original stream.

Looking at your second log, the server does nothing at all. Are you sure there is no FFmpeg.* logs next to the Jellyfin log? Also check the transcodes output directory - it should be empty if no one is playing.

For now I think that the easiest way of sorting out the problem for my personal needs is to force transcoding to happen always for this particular client (Tizen TV). But so far I have not found a setting that can achieve it. if I could find it and hard-code it in the app itself then that would solve my problem.

You are already forcing transcoding by setting a bitrate limit. The server gets it: Bitrate exceeds DirectStream limit: media bitrate: 43149001, max bitrate: 20000000. Transcoding should be triggered by this with TranscodeReason.ContainerBitrateExceedsLimit.

You can also force transcoding by burn-in the subtitles (Settings -> Subtitles -> Burn subtitles -> All). But I assume the result will be the same.

RTUnit commented 2 years ago

Changing burn-in subtitles settings did not impacted transcoding.

The error "media element error: 0" sometimes comes as "media element error: 3" (mediadecodeerror or MEDIA_ERR_DECODE). The URL which triggers transcoding and actually plays back the video from Tizen Browser app is following:

http://192.168.2.107:8096/videos/e30d94ed-6c23-79da-27d6-9fc009404fa8/master.m3u8?DeviceId=TW96aWxsYS81LjAgKFNNQVJULVRWOyBMaW51eDsgVGl6ZW4gMi4zKSBBcHBsZVdlYmtpdC81MzguMSAoS0hUTUwsIGxpa2UgR2Vja28pIFNhbXN1bmdCcm93c2VyLzEuMCBUViBTYWZhcmkvNTM4LjF8MTY0NTk3MTUzNTc4MQ11&MediaSourceId=e30d94ed6c2379da27d69fc009404fa8&VideoCodec=h264,hevc&AudioCodec=aac,mp3,ac3,eac3&AudioStreamIndex=1&VideoBitrate=19360000&AudioBitrate=640000&PlaySessionId=c8366e3db2bd4d5caa8ad06b31c7bbf7&api_key=118b4a761c304e5eac7600fef18d9505&SubtitleMethod=Encode&TranscodingMaxAudioChannels=6&RequireAvc=false&Tag=3a0a56655ff43b2d011f699800a5ed10&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=False&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&hevc-profile=main,main10&hevc-level=183&TranscodeReasons=ContainerBitrateExceedsLimit

I tried to debug the Jellyfin app at the step where it launches video playback and replace the URL to the same as above, but still got "media element error: 3" (mediadecodeerror).

To do this:

  1. placed break-point in play() function of the htmlVideoPlayer plugin: https://github.com/jellyfin/jellyfin-web/blob/1e6c3edf7e40ca5a4de701ec732d0ed7494e29e4/src/plugins/htmlVideoPlayer/plugin.js#L342
  2. Executed from Console: options.url = options.url.replace("&VideoCodec=hevc,h264&", "&VideoCodec=h264,hevc&").replace("&AudioCodec=aac,mp3,ac3,eac3,flac&", "&AudioCodec=aac,mp3,ac3,eac3&").replace("&SegmentContainer=mp4&", "&SegmentContainer=ts&")
  3. I even additionally tried to replace the bitrate using .replace("&VideoBitrate=19360000&", "&VideoBitrate=2000000&")

But still got the same error.

One thing I notice that streaming (or direct playing) when the bitrate is within supported range, the stream.mkv api is launched, but when bitrate is too high then master.m3u8 api is called.

So if I replace master.m3u8 with stream.mkv then the in result I get this URL:

http://192.168.2.107:8096/videos/e30d94ed-6c23-79da-27d6-9fc009404fa8/stream.mkv?DeviceId=TW96aWxsYS81LjAgKFNNQVJULVRWOyBMaW51eDsgVGl6ZW4gMi4zKSBBcHBsZVdlYmtpdC81MzguMSAoS0hUTUwsIGxpa2UgR2Vja28pIFNhbXN1bmdCcm93c2VyLzEuMCBUViBTYWZhcmkvNTM4LjF8MTY0NTk3MTUzNTc4MQ11&MediaSourceId=e30d94ed6c2379da27d69fc009404fa8&VideoCodec=h264,hevc&AudioCodec=aac,mp3,ac3,eac3&AudioStreamIndex=1&VideoBitrate=19360000&AudioBitrate=640000&PlaySessionId=c8366e3db2bd4d5caa8ad06b31c7bbf7&api_key=118b4a761c304e5eac7600fef18d9505&SubtitleMethod=Encode&TranscodingMaxAudioChannels=6&RequireAvc=false&Tag=3a0a56655ff43b2d011f699800a5ed10&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=False&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&hevc-profile=main,main10&hevc-level=183&TranscodeReasons=ContainerBitrateExceedsLimit

Launching it will kick-off transcoding on the server, but anyway Tizen app is ending with "media element error: 3" (mediadecodeerror).

In the core of the Jellyfin-Web is using HTML element VIDEO. This element is created once the video playback is started, and destroyed once playback is finished. Because I have the mediadecodeerror occuring then the video element is not destroyed, and I can access it from debugger console: var dlg = document.querySelector('.videoPlayerContainer'); var videoElement = dlg.querySelector('video');

then I can change the content url by doing: videoElement.src = "http://...master.m3u8..."

Playing around with different parameters of the HTTP request did not helped to get any further.

One thing I notice is when I set window.location to "http://...master.m3u8..." then the Mime Type is displayed as application/vnd.apple.mpegurl, but when set it to "http://...stream.mkv..." then it is displayed as video/x-matroska:

image

image

But I cannot confirm that problem is caused by Mime type.

I have spent whole weekend debugging, and for now do not have any more ideas to try out :(

If someone will benefit, I discovered that setting this logging parameter to lowest MS number will log HTTP requests in the log file (this helps if you do not want to monitor using Wireshark or use similar tools): image

dmitrylyzo commented 2 years ago

One thing I notice that streaming (or direct playing) when the bitrate is within supported range, the stream.mkv api is launched, but when bitrate is too high then master.m3u8 api is called.

stream.{container} is direct play, master.m3u8 is HLS.

In the core of the Jellyfin-Web is using HTML element VIDEO. This element is created once the video playback is started, and destroyed once playback is finished. Because I have the mediadecodeerror occuring then the video element is not destroyed, and I can access it from debugger console: var dlg = document.querySelector('.videoPlayerContainer'); var videoElement = dlg.querySelector('video');

then I can change the content url by doing: videoElement.src = "http://...master.m3u8..."

Changing the url after an error occurs makes no sense - it will be replaced on the retry, but with an additional constraint. If the video fails with a media element error other than 0, JF retries with video transcoding, then (on the second fail) with full transcoding.

One thing I notice is when I set window.location to "http://...master.m3u8..." then the Mime Type is displayed as application/vnd.apple.mpegurl, but when set it to "http://...stream.mkv..." then it is displayed as video/x-matroska:

That's right. When you request stream.mkv you get the original file (it is MKV - video/x-matroska). There will be different containers for other file formats. When you request master.m3u8 you get HLS playlist.

Seeing all this, I suppose I need to explain how playback works. I assume you want to limit the bitrate, understanding that the video will be transcoded. First, forget the Samsung browser - it has a more recent web engine (Chrome) than the app (WebKit) - they cannot be compared. Also browser may use hls.js (JS HLS implementation).

  1. When you hit Play, client requests /Items/{itemId}/PlaybackInfo endpoint for playback url. https://github.com/jellyfin/jellyfin-web/blob/cbf9c30c061c7c110e3c42680edd966f110871b6/src/components/playback/playbackmanager.js#L2380
  2. In the response, there is TranscodingUrl that points to /videos/{itemId}/master.m3u8?DeviceId=.... https://github.com/jellyfin/jellyfin-web/blob/cbf9c30c061c7c110e3c42680edd966f110871b6/src/components/playback/playbackmanager.js#L2384 https://github.com/jellyfin/jellyfin-web/blob/cbf9c30c061c7c110e3c42680edd966f110871b6/src/components/playback/playbackmanager.js#L2503-L2515
  3. Then VIDEO element requests master.m3u8. It looks like:
    #EXTM3U
    #EXT-X-STREAM-INF:BANDWIDTH=1875040,AVERAGE-BANDWIDTH=1875040,VIDEO-RANGE=SDR,CODECS="avc1.640028",RESOLUTION=1920x1080,FRAME-RATE=25
    main.m3u8?DeviceId=...&MediaSourceId={itemId}&VideoCodec=h264&AudioCodec=aac,mp3&VideoBitrate=139808000&AudioBitrate=192000&PlaySessionId=...&api_key=...&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=...&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&h264-deinterlace=true&TranscodeReasons=VideoCodecNotSupported

    Its purpose is to provide different streams so that the client can choose the most appropriate one.

  4. It requests main.m3u8:
    #EXTM3U
    #EXT-X-PLAYLIST-TYPE:VOD
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:6
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:6.000000, nodesc
    hls1/main/0.ts?DeviceId=...&MediaSourceId={itemId}&VideoCodec=h264&AudioCodec=aac,mp3&VideoBitrate=139808000&AudioBitrate=192000&PlaySessionId=...&api_key=...&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=...&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&h264-deinterlace=true&TranscodeReasons=VideoCodecNotSupported&runtimeTicks=0&actualSegmentLengthTicks=60000000
    #EXTINF:6.000000, nodesc
    hls1/main/1.ts?DeviceId=...&MediaSourceId={itemId}&VideoCodec=h264&AudioCodec=aac,mp3&VideoBitrate=139808000&AudioBitrate=192000&PlaySessionId=...&api_key=...&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=...&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&h264-deinterlace=true&TranscodeReasons=VideoCodecNotSupported&runtimeTicks=60000000&actualSegmentLengthTicks=60000000
    #EXTINF:6.000000, nodesc
    hls1/main/2.ts?DeviceId=...&MediaSourceId={itemId}&VideoCodec=h264&AudioCodec=aac,mp3&VideoBitrate=139808000&AudioBitrate=192000&PlaySessionId=...&api_key=...&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=...&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&h264-deinterlace=true&TranscodeReasons=VideoCodecNotSupported&runtimeTicks=120000000&actualSegmentLengthTicks=60000000
    #EXTINF:6.000000, nodesc
    hls1/main/3.ts?DeviceId=...&MediaSourceId={itemId}&VideoCodec=h264&AudioCodec=aac,mp3&VideoBitrate=139808000&AudioBitrate=192000&PlaySessionId=...&api_key=...&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=...&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&h264-profile=high,main,baseline,constrainedbaseline,high10&h264-level=52&h264-deinterlace=true&TranscodeReasons=VideoCodecNotSupported&runtimeTicks=180000000&actualSegmentLengthTicks=60000000
    #EXTINF:6.000000, nodesc
    ...
  5. It keeps requesting HLS segments (*.ts). The transcoding process should start on the server when the first segment is requested.

I have tried limiting the bitrate on webOS 1.2 (~Tizen 2.3) emulator and got master.m3u8 request stalled. But I see the transcoding is in progress. As I said, check if FFmpeg* logs are in place. The video starts playing only after the transcoding is finished, but the master.m3u8 request is still pending and you can't seek :confused: