flutter-tizen / plugins

Flutter plugins for Tizen
66 stars 47 forks source link

Not able to play DRM protected content in AV Player #747

Open atuljha3334 opened 1 month ago

atuljha3334 commented 1 month ago

I’m developing a Flutter app for Samsung Tizen TV that streams DRM-protected content using the Media Player API. I’m facing an issue when trying to play Widevine-encrypted DASH & HLS content. I'm getting errors right after the video player initializes.

Error I'm getting for HLS content -

[E] (process:1243): GLib-CRITICAL : 14:03:11.945: g_path_get_basename: assertion 'file_name != NULL' failed [E] (:1243): GStreamer-WARNING : 14:03:12.166: Failed to load plugin '/opt/usr/apps/com.example.avs_android_tv_app/lib/libgsthls.so': libclearkey.so.0: cannot open shared object file: Operation not permitted [E] (:1243): GStreamer-WARNING : 14:03:13.115: Failed to load plugin '/usr/lib/gstreamer-1.0/libgsthls.so': libclearkey.so.0: cannot open shared object file: Operation not permitted (:1243): GStreamer-CRITICAL : 14:03:13.117: gst_element_factory_create_valist: assertion 'newfactory != NULL' failed

Error for DASH content -

[E] (:1243): GStreamer-CRITICAL : 14:13:13.154: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed [E] (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed [E] (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed [E] (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed [E] (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed (:1243): GStreamer-CRITICAL : 14:13:13.155: gst_value_get_int_range_max: assertion 'GST_VALUE_HOLDS_INT_RANGE (value)' failed [E] (:1243): GStreamer-CRITICAL : 14:13:13.464: gst_mini_object_unref: assertion 'mini_object != NULL' failed [E] (:1243): GStreamer-CRITICAL : 14:13:13.465: gst_mini_object_unref: assertion 'mini_object != NULL' failed [E] (:1243): GLib-GObject-WARNING : 14:13:13.467: ../gobject/gsignal.c:2614: signal 'need-data-video' is invalid for instance '0x8a006590' of type 'GstDashSrc' [E] (:1243): GLib-GObject-WARNING : 14:13:13.467: ../gobject/gsignal.c:2614: signal 'need-data-audio' is invalid for instance '0x8a006590' of type 'GstDashSrc' [E] (:1243): GStreamer-WARNING : 14:13:15.848: ../subprojects/gstreamer/gst/gstpad.c:4672:gst_pad_push_data: Got data flow before stream-start event [E] (:1243): GStreamer-WARNING : 14:13:15.849: ../subprojects/gstreamer/gst/gstpad.c:4677:gst_pad_push_data: Got data flow before segment event (:1243): GStreamer-WARNING : 14:13:15.849: ../subprojects/gstreamer/gst/gstpad.c:4411:gst_pad_chain_data_unchecked: Got data flow before stream-start event (:1243): GStreamer-WARNING : 14:13:15.849: ../subprojects/gstreamer/gst/gstpad.c:4416:gst_pad_chain_data_unchecked: Got data flow before segment event [E] (:1243): GStreamer-WARNING : 14:13:15.850: ../subprojects/gstreamer/gst/gstpad.c:4672:gst_pad_push_data: Got data flow before stream-start event [E] (:1243): GStreamer-WARNING : 14:13:15.850: ../subprojects/gstreamer/gst/gstpad.c:4677:gst_pad_push_data: Got data flow before segment event (:1243): GStreamer-WARNING : 14:13:15.850: ../subprojects/gstreamer/gst/gstpad.c:4411:gst_pad_chain_data_unchecked: Got data flow before stream-start event (:1243): GStreamer-WARNING : 14:13:15.850: ../subprojects/gstreamer/gst/gstpad.c:4416:gst_pad_chain_data_unchecked: Got data flow before segment event [E] (:1243): GStreamer-CRITICAL : 14:13:15.859: gst_debug_log_valist: assertion 'category != NULL' failed (:1243): GStreamer-WARNING : 14:13:15.860: Trying to set string on structure field 'format', but string is not valid UTF-8. Please file a bug. (:1243): GStreamer-CRITICAL : 14:13:15.861: gst_debug_log_valist: assertion 'category != NULL' failed [E] (:1243): GStreamer-WARNING : 14:13:15.867: ../subprojects/gstreamer/gst/gstpad.c:5337:store_sticky_event: Sticky event misordering, got 'caps' before 'stream-start' [E] (:1243): GStreamer-WARNING **: 14:13:15.867: ../subprojects/gstreamer/gst/gstpad.c:5337:store_sticky_event: Sticky event misordering, got 'caps' before 'stream-start'

How can I properly configure Widevine DRM for Tizen’s media player in Flutter, or is there a better approach? Thanks in advance for your help!

xiaowei-guan commented 1 month ago

@atuljha3334 If you want to play DRM content, your app must be signed with a partner-level certificate. Please refer to this website : https://docs.tizen.org/partners/specialist

atuljha3334 commented 1 month ago

@xiaowei-guan I've already created partner certificate via Tizen Certificate Manager. Why do I need to sign the app with another certificate??

xiaowei-guan commented 1 month ago

@xiaowei-guan I've already created partner certificate via Tizen Certificate Manager. Why do I need to sign the app with another certificate??

Do you run app on Tizen 6.0 TV device?

atuljha3334 commented 1 month ago

@xiaowei-guan I've already created partner certificate via Tizen Certificate Manager. Why do I need to sign the app with another certificate??

Do you run app on Tizen 6.0 TV device?

These logs are from Tizen 7.0 TV

xiaowei-guan commented 1 month ago

Do you change your tizen-manifest.xml? https://github.com/flutter-tizen/plugins/blob/master/packages/video_player_avplay/README.md?plain=1#L26-L29

xiaowei-guan commented 1 month ago

@atuljha3334 Can you play example DRM content at your side? or you can share your sample app code, I can try to play it at my side.

atuljha3334 commented 1 month ago

@atuljha3334 Can you play example DRM content at your side? or you can share your sample app code, I can try to play it at my side.

@xiaowei-guan please find the implementation below:

_controller = VideoPlayerController.network( 'https://storage.googleapis.com/shaka-demo-assets/sintel-widevine/dash.mpd', drmConfigs: const DrmConfigs( type: DrmType.widevine, licenseServerUrl: 'https://cwip-shaka-proxy.appspot.com/no_auth', ) )

xiaowei-guan commented 1 month ago

@atuljha3334 I also can't play this URL, I will check this issue with MM team.