{ "id": "171164", "key": "TIMOB-25801", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "20115", "name": "Release 7.3.0", "archived": false, "released": true, "releaseDate": "2018-08-17" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2018-05-21T11:29:16.000+0000", "created": "2018-02-22T19:25:15.000+0000", "priority": { "name": "High", "id": "2" }, "labels": [ "ios", "videoplayer" ], "versions": [ { "id": "20060", "description": "", "name": "Release 7.0.2", "archived": false, "released": true, "releaseDate": "2018-02-09" } ], "issuelinks": [], "assignee": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2018-07-11T17:23:28.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10206", "name": "iOS", "description": "iOS Platform" } ], "description": "on iOS titanium SDK 7.0.2.GA once the playback is done the media player fires the complete event (which is correct) and then the stop event (which shouldn't)\r\n\r\nalso the function stop doesn't stop the playback but rather pauses it.\r\n\r\nand the durationavailable event is fired twice the second time an audio/video is played.\r\n\r\n{code:javascript}\r\n// Some comments here\r\nvar dataStructure = [{\r\n title : \"Play video\",\r\n action : playVideo\r\n}, {\r\n title : \"Pause video\",\r\n action : pauseVideo\r\n}, {\r\n title : \"Stop video\",\r\n action : stopVideo\r\n}, {\r\n title : \"Change video source (local)\",\r\n action : changeLocalVideoSource\r\n}, {\r\n title : \"Change video source (remote)\",\r\n action : changeRemoteImageSource\r\n}, {\r\n title : \"Change background color\",\r\n action : changeBackgroundColor\r\n}, {\r\n title : \"Set volume to 50%\",\r\n action : decreaseVolume\r\n}, {\r\n title : \"Get playable duration\",\r\n action : getPlayableDuration\r\n}, {\r\n title : \"Get playback state\",\r\n action : getPlaybackState\r\n}, {\r\n title : \"Set full width\",\r\n action : setSizeFullWidth\r\n}, {\r\n title : \"Set width + height to 300 (animated)\",\r\n action : setSize\r\n}, {\r\n title : \"Is playing?\",\r\n action : getPlaying\r\n}, {\r\n title: \"Take screenshot at 5s\",\r\n action: takeScreenshot\r\n}, {\r\n title: \"Take multiple screenshots\",\r\n action: captureSeriesOfImages\r\n}, {\r\n title: \"Set initial playback time\",\r\n action: setInitialPlaybackTime\r\n}, {\r\n title: \"Is airPlay allowed?\",\r\n action: getAllowsAirPlay\r\n}, {\r\n title: \"repeatMode ?\",\r\n action: getRepeatMode\r\n}];\r\n \r\n \r\nvar counter = 0;\r\n \r\n/* -- UI -- */\r\n \r\nvar isiOS = (Ti.Platform.osname == \"ipad\" || Ti.Platform.osname == \"iphone\");\r\n \r\nvar win = Titanium.UI.createWindow({\r\n title : 'Video Player Demo',\r\n backgroundColor : '#fff',\r\n layout : 'vertical'\r\n});\r\n \r\nvar nav = isiOS ? Ti.UI.iOS.createNavigationWindow({\r\n window : win\r\n}) : null;\r\n \r\nvar header = Ti.UI.createView({\r\n height : 350,\r\n backgroundColor : \"#eee\"\r\n});\r\n \r\nvar content = Ti.UI.createScrollView({\r\n layout : \"horizontal\",\r\n scrollType : \"vertical\",\r\n contentWidth : Ti.Platform.displayCaps.platformWidth,\r\n contentHeight : 1000\r\n});\r\n \r\nvar videoPlayer = Titanium.Media.createVideoPlayer({\r\n autoplay : true,\r\n url : 'http://techslides.com/demos/sample-videos/small.mp4',//'movie.mp4',\r\n initialPlaybackTime: 1000,\r\n showsControls:true,\r\n pictureInPictureEnabled : true, // Only supported on iOS9 & iPad Air or later!\r\n scalingMode : Titanium.Media.VIDEO_SCALING_MODE_RESIZE_ASPECT,\r\n repeatMode : Titanium.Media.VIDEO_REPEAT_MODE_NONE\r\n});\r\n \r\nfor (var i = 0; i < dataStructure.length; i++) {\r\n var btn = Ti.UI.createButton({\r\n top : '3.5%',\r\n left : '7%',\r\n height : 60,\r\n width : '40%',\r\n tintColor : '#b50d00',\r\n backgroundColor : '#e0e0e0',\r\n title : dataStructure[i].title\r\n });\r\n \r\n btn.addEventListener(\"click\", dataStructure[i].action);\r\n \r\n content.add(btn);\r\n}\r\n \r\nheader.add(videoPlayer);\r\nwin.add(header);\r\nwin.add(content);\r\n \r\nif (nav) {\r\n nav.open();\r\n} else {\r\n win.open();\r\n}\r\n \r\n/* -- Events -- */\r\n \r\nvideoPlayer.addEventListener('complete', function(e) {\r\n Ti.API.info('complete ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('durationavailable', function(e) {\r\n Ti.API.info('durationavailable ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('error', function(e) {\r\n Ti.API.info('error ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('load', function(e) {\r\n Ti.API.info('load ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('playbackstate', function(e) {\r\n Ti.API.info('playbackstate ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('playing', function(e) {\r\n Ti.API.info('playing ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('preload', function(e) {\r\n Ti.API.info('preload ' + JSON.stringify(e));\r\n});\r\n{code}\r\n", "attachment": [], "flagged": false, "summary": "iOS: SDK 7.0.2.GA - VideoPlayer playback issues", "creator": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "subtasks": [], "reporter": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "environment": null, "closedSprints": [ { "id": 1028, "state": "closed", "name": "2018 Sprint 09 SDK", "startDate": "2018-04-22T22:53:08.928Z", "endDate": "2018-05-06T22:53:00.000Z", "completeDate": "2018-05-07T00:02:15.883Z", "originBoardId": 114 }, { "id": 1018, "state": "closed", "name": "2018 Sprint 07 SDK", "startDate": "2018-03-25T21:59:36.637Z", "endDate": "2018-04-08T21:59:00.000Z", "completeDate": "2018-04-08T17:55:14.467Z", "originBoardId": 114 }, { "id": 1034, "state": "closed", "name": "2018 Sprint 10 SDK", "startDate": "2018-05-07T00:03:21.636Z", "endDate": "2018-05-21T00:03:00.000Z", "completeDate": "2018-05-20T20:54:58.928Z", "originBoardId": 114 }, { "id": 1035, "state": "closed", "name": "2018 Sprint 11 SDK", "startDate": "2018-05-20T20:57:43.542Z", "endDate": "2018-06-03T20:57:00.000Z", "completeDate": "2018-06-04T15:13:14.425Z", "originBoardId": 114 }, { "id": 1021, "state": "closed", "name": "2018 Sprint 08 SDK", "startDate": "2018-04-08T17:57:36.122Z", "endDate": "2018-04-22T17:57:00.000Z", "completeDate": "2018-04-22T22:51:19.120Z", "originBoardId": 114 }, { "id": 1008, "state": "closed", "name": "2018 Sprint 06 SDK", "startDate": "2018-03-11T22:18:04.396Z", "endDate": "2018-03-25T22:18:00.000Z", "completeDate": "2018-03-25T21:52:36.683Z", "originBoardId": 216 } ], "comment": { "comments": [ { "id": "434818", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Hey [~horozco], it looks like your sample is missing the functions it calls, e.g. {{playVideo}}.\r\n\r\n*EDIT*: I assume you got the test-case from a different ticket. Here is the full case:\r\n{code:js}\r\n\r\n/* -- Data Structure -- */\r\n\r\nvar dataStructure = [{\r\n\ttitle : \"Play video\",\r\n\taction : playVideo\r\n}, {\r\n\ttitle : \"Pause video\",\r\n\taction : pauseVideo\r\n}, {\r\n\ttitle : \"Stop video\",\r\n\taction : stopVideo\r\n}, {\r\n\ttitle : \"Change video source (local)\",\r\n\taction : changeLocalVideoSource\r\n}];\r\n\r\n/* -- UI -- */\r\n\r\nvar isiOS = (Ti.Platform.osname == \"ipad\" || Ti.Platform.osname == \"iphone\");\r\n\r\nvar win = Titanium.UI.createWindow({\r\n\ttitle : 'Video View Demo',\r\n\tbackgroundColor : '#fff',\r\n\tlayout : 'vertical'\r\n});\r\n\r\nvar nav = isiOS ? Ti.UI.iOS.createNavigationWindow({\r\n\twindow : win\r\n}) : null;\r\n\r\nvar header = Ti.UI.createView({\r\n\theight : 350,\r\n\tbackgroundColor : \"#eee\"\r\n});\r\n\r\nvar content = Ti.UI.createScrollView({\r\n\tlayout : \"vertical\"\r\n});\r\n\r\nvar videoPlayer = Titanium.Media.createVideoPlayer({\r\n\tautoplay : true,\r\n\tbackgroundColor : 'blue',\r\n\theight : 300,\r\n\twidth : 300,\r\n\turl : 'movie.mp4',\r\n\tmediaControlStyle : Titanium.Media.VIDEO_CONTROL_DEFAULT,\r\n\tscalingMode : Titanium.Media.VIDEO_SCALING_ASPECT_FIT\r\n});\r\n\r\nfor (var i = 0; i < dataStructure.length; i++) {\r\n\tvar btn = Ti.UI.createButton({\r\n\t\ttop : 20,\r\n\t\twidth : '80%',\r\n\t\theight : '10%',\r\n\t\tbackgroundColor : '#ddd',\r\n\t\tborderRadius : '5%',\r\n\t\ttitle : dataStructure[i].title\r\n\t});\r\n\r\n\tbtn.addEventListener(\"click\", dataStructure[i].action);\r\n\r\n\tcontent.add(btn);\r\n}\r\n\r\nheader.add(videoPlayer);\r\nwin.add(header);\r\nwin.add(content);\r\n\r\nif (nav) {\r\n\tnav.open();\r\n} else {\r\n\twin.open();\r\n}\r\n\r\n/* -- Events -- */\r\n\r\nvideoPlayer.addEventListener('complete', function(e) {\r\n\tTi.API.info('complete ' + JSON.stringify(e));\r\n});\r\n\r\nvideoPlayer.addEventListener('durationavailable', function(e) {\r\n\tTi.API.info('durationavailable ' + JSON.stringify(e));\r\n});\r\n\r\nvideoPlayer.addEventListener('error', function(e) {\r\n\tTi.API.info('error ' + JSON.stringify(e));\r\n});\r\n\r\nvideoPlayer.addEventListener('load', function(e) {\r\n\tTi.API.info('load ' + JSON.stringify(e));\r\n});\r\n\r\nvideoPlayer.addEventListener('playbackstate', function(e) {\r\n\tTi.API.info('playbackstate ' + JSON.stringify(e));\r\n});\r\n\r\nvideoPlayer.addEventListener('playing', function(e) {\r\n\tTi.API.info('playing ' + JSON.stringify(e));\r\n});\r\n\r\nvideoPlayer.addEventListener('preload', function(e) {\r\n\tTi.API.info('preload ' + JSON.stringify(e));\r\n});\r\n\r\n/* -- Actions -- */\r\n\r\nfunction playVideo() {\r\n\tvideoPlayer.play();\r\n}\r\n\r\nfunction pauseVideo() {\r\n\tvideoPlayer.pause();\r\n}\r\n\r\nfunction stopVideo() {\r\n\tvideoPlayer.stop();\r\n}\r\n\r\nfunction changeLocalVideoSource() {\r\n\tvideoPlayer.url = 'another.mp4';\r\n\tvideoPlayer.play();\t\r\n}\r\n{code}\r\nRegarding your report:\r\n- \"stop\" event fired once the movie completes: -Need to investigate- There is no \"stop\" event, what do you mean?\r\n- The function \"stop()\" doesn't stop the playback but rather pauses it: Cannot reproduce, it stops correctly\r\n- The \"durationavailable\" event is fired twice the second time a video is played: Cannot reproduce, it only fires once (before the video starts). It uses the native KVO on {{player.currentItem.duration}} which isn't handled separately. If you can provide a test case for that, let me know!", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-02-23T14:08:49.000+0000", "updated": "2018-02-23T14:27:56.000+0000" }, { "id": "434838", "author": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Hey Hans, here is a complete and functional test case:\r\nSteps to reproduce the errors:\r\n* once the movie completes, the complete event is fired (correct) along with the playbackstate event with the e.playbackState == Ti.Media.VIDEO_PLAYBACK_STATE_STOPPED (incorrect)\r\n* When the video is playing and click 'Stop video' then click 'Get playback state' you will see that it is actually paused not stopped, is not just the playbackstate flag that's incorrect it is actually not stopping the playback.\r\n* durationavailable event gets fired twice, click 'change source' to play a differente media file and look at the console you will see that durationavailable was fired twice.\r\n\r\nThanks!\r\n\r\n{code:javascript}\r\nvar dataStructure = [{\r\n title : \"Play video\",\r\n action : playVideo\r\n}, {\r\n title : \"Pause video\",\r\n action : pauseVideo\r\n}, {\r\n title : \"Stop video\",\r\n action : stopVideo\r\n},{\r\n title : \"Change source\",\r\n action : changeRemoteSource\r\n},{\r\n title : \"Change source 2\",\r\n action : changeRemoteSourceTwo\r\n},{\r\n title : \"Get playback state\",\r\n action : getPlaybackState\r\n}];\r\n \r\n/* -- UI -- */\r\n \r\nvar isiOS = (Ti.Platform.osname == \"ipad\" || Ti.Platform.osname == \"iphone\");\r\n \r\nvar win = Titanium.UI.createWindow({\r\n title : 'Video Player Demo',\r\n backgroundColor : '#fff',\r\n layout : 'vertical'\r\n});\r\n \r\nvar nav = isiOS ? Ti.UI.iOS.createNavigationWindow({\r\n window : win\r\n}) : null;\r\n \r\nvar header = Ti.UI.createView({\r\n height : 350,\r\n backgroundColor : \"#eee\"\r\n});\r\n \r\nvar content = Ti.UI.createScrollView({\r\n layout : \"horizontal\",\r\n scrollType : \"vertical\",\r\n contentWidth : Ti.Platform.displayCaps.platformWidth,\r\n contentHeight : 1000\r\n});\r\n \r\nvar videoPlayer = Titanium.Media.createVideoPlayer({\r\n autoplay : true,\r\n url : 'http://techslides.com/demos/sample-videos/small.mp4',//'movie.mp4',\r\n initialPlaybackTime: 1000,\r\n showsControls:true,\r\n pictureInPictureEnabled : true, // Only supported on iOS9 & iPad Air or later!\r\n scalingMode : Titanium.Media.VIDEO_SCALING_MODE_RESIZE_ASPECT,\r\n repeatMode : Titanium.Media.VIDEO_REPEAT_MODE_NONE\r\n});\r\n \r\nfor (var i = 0; i < dataStructure.length; i++) {\r\n var btn = Ti.UI.createButton({\r\n top : '3.5%',\r\n left : '7%',\r\n height : 60,\r\n width : '40%',\r\n tintColor : '#b50d00',\r\n backgroundColor : '#e0e0e0',\r\n title : dataStructure[i].title\r\n });\r\n \r\n btn.addEventListener(\"click\", dataStructure[i].action);\r\n \r\n content.add(btn);\r\n}\r\n \r\nheader.add(videoPlayer);\r\nwin.add(header);\r\nwin.add(content);\r\n \r\nif (nav) {\r\n nav.open();\r\n} else {\r\n win.open();\r\n}\r\n \r\n/* -- Events -- */\r\n \r\nvideoPlayer.addEventListener('complete', function(e) {\r\n Ti.API.info('complete ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('durationavailable', function(e) {\r\n Ti.API.info('durationavailable ----------------------->' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('error', function(e) {\r\n Ti.API.info('error ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('load', function(e) {\r\n Ti.API.info('load ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('playbackstate', function(e) {\r\n Ti.API.info('playbackstate ' + JSON.stringify(e));\r\n if ( e.playbackState === Ti.Media.VIDEO_PLAYBACK_STATE_STOPPED ) {\r\n\t\talert('stopped');\r\n\t}\r\n});\r\n \r\nvideoPlayer.addEventListener('playing', function(e) {\r\n Ti.API.info('playing ' + JSON.stringify(e));\r\n});\r\n \r\nvideoPlayer.addEventListener('preload', function(e) {\r\n Ti.API.info('preload ' + JSON.stringify(e));\r\n});\r\n \r\n/* -- Actions -- */\r\n \r\nfunction playVideo() {\r\n videoPlayer.play();\r\n}\r\n \r\nfunction pauseVideo() {\r\n videoPlayer.pause();\r\n}\r\n \r\nfunction stopVideo() {\r\n videoPlayer.stop();\r\n}\r\n \r\nfunction changeRemoteSource() {\r\n\tvideoPlayer.stop();\r\n\t// audioverse.org media file\r\n videoPlayer.url = 'https://d31oibm4w2hgxr.cloudfront.net/2016/11/15565/_narr_AuntSueUncleDan-ThePersecutorFromTarsus-80k.mp3';\r\n videoPlayer.play();\r\n}\r\n\r\nfunction changeRemoteSourceTwo() {\r\n\tvideoPlayer.stop();\r\n\t// audioverse.org media file\r\n videoPlayer.url = 'https://d31oibm4w2hgxr.cloudfront.net/2017/06/16552/JeanBoonstra_narr_JeanBoonstra-Episode01-Di...yMountain,Season1-96k.mp3';\r\n videoPlayer.play();\r\n}\r\n \r\n function getShowControls() {\r\n alert(videoPlayer.showsControls);\r\n}\r\n \r\nfunction getPlaybackState() {\r\n\tif ( videoPlayer.playbackState == Ti.Media.VIDEO_PLAYBACK_STATE_PLAYING)\r\n\t\talert('Playing');\r\n\telse if ( videoPlayer.playbackState == Ti.Media.VIDEO_PLAYBACK_STATE_PAUSED)\r\n\t\talert('Paused');\r\n\telse if ( videoPlayer.playbackState == Ti.Media.VIDEO_PLAYBACK_STATE_STOPPED)\r\n\t\talert('Stopped');\r\n\telse\r\n \talert(videoPlayer.playbackState);\r\n}\r\n{code}\r\n", "updateAuthor": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-23T19:59:40.000+0000", "updated": "2018-02-28T14:02:05.000+0000" }, { "id": "434950", "author": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "body": "I verified this test case in previous implementation of TiMediaVideoPlayer where we were using MPMoviePlayerViewController (SDK 6.3.0) and found following result in context of above 3 points -\r\n\r\n1. Once movie completes, its playback state event gives Ti.Media.VIDEO_PLAYBACK_STATE_PAUSED.\r\n2. When the video is playing and click 'Stop video' then click 'Get playback state' it gives Ti.Media.VIDEO_PLAYBACK_STATE_STOPPED.\r\n3. If we click 'change source' to play a differente media file, durationavailable event gets fired twice. And in native app also, it get fired twice. \r\n\r\nSo we have to fix point 1 and point 2. Point 3 is expected behaviour.\r\n", "updateAuthor": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-27T09:41:06.000+0000", "updated": "2018-02-27T10:26:43.000+0000" }, { "id": "434989", "author": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "body": "PR - https://github.com/appcelerator/titanium_mobile/pull/9890", "updateAuthor": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-28T06:41:54.000+0000", "updated": "2018-02-28T06:41:54.000+0000" }, { "id": "435000", "author": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Vijay Singh is not just the playbackstate value that's incorrect it is actually not stopping the playback. if you call stop() it's not stopping the playback. The playbackstate value is useful to have it correct but it's more important that the playback is actually stopped.", "updateAuthor": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-28T14:02:35.000+0000", "updated": "2018-02-28T14:07:29.000+0000" }, { "id": "435042", "author": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~horozco] Do you mean, after clicking stop button movie continues to play?\r\nI can see when I click stop button, it comes to starting position of video and it's not playing.\r\n\r\nAnd in AVPlayerViewController, apple has not given stop api. So this is achieved in SDK by setting seekToTime to zero with pause for backward compatibility. \r\n", "updateAuthor": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-03-01T04:04:18.000+0000", "updated": "2018-03-01T04:34:59.000+0000" }, { "id": "435053", "author": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "body": "What I meant is after you stop the movie, and you play another one (click change source) until then the playbackstate event (STOPPED) is fired:\r\n\r\n{code:javascript}\r\nvideoPlayer.addEventListener('playbackstate', function(e) {\r\n Ti.API.info('playbackstate ' + JSON.stringify(e));\r\n if ( e.playbackState === Ti.Media.VIDEO_PLAYBACK_STATE_STOPPED ) {\r\n\t\talert('stopped');\r\n\t}\r\n});\r\n{code}\r\n\r\nThat sometimes causes to the new movie playing to stop.\r\n\r\nIn other words, after you stop a movie and then change the source to play a new movie (videoPlayer.setUrl('newMovie.mp4'); videoPlayer.Play() ) until then the previous movie is actually stopped and the playbackstate event STOPPED is fired.\r\n\r\nFor some reason, the VIdeoPlayer waits until a new movie is setted and played to acutally stop the previous one and since the stop functionality it's executed until that point it causes to stop the current movie.\r\n\r\nHope that helps.\r\n\r\nThe best.", "updateAuthor": { "name": "horozco", "key": "horozco", "displayName": "Henry Orozco", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-03-01T13:45:53.000+0000", "updated": "2018-03-01T13:50:02.000+0000" }, { "id": "435566", "author": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~horozco] I am not able to reproduce the issue, which you are mentioning, using this PR.\r\n[~ewieber] Can you please verify while testing it? Thanks.", "updateAuthor": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-03-14T07:13:49.000+0000", "updated": "2018-03-14T07:13:49.000+0000" }, { "id": "439131", "author": { "name": "smohammed", "key": "smohammed", "displayName": "Samir Mohammed", "active": true, "timeZone": "America/Los_Angeles" }, "body": "*Closing ticket.* Verified fix in SDK Version: {{7.3.0.v20180628132121}}\r\n\r\nAble to follow and complete the steps above mentioned above by [~vijaysingh] \r\n\r\n*Test Environment*\r\n\r\n{code:java}\r\nAPPC Studio: 5.0.0.201712081732\r\nAPPC CLI: 7.0.4\r\niPhone 6 simulator (11.2)\r\nOperating System Name: Mac OS High Sierra\r\nOperating System Version: 10.13\r\nNode.js Version: 8.9.1\r\nXcode 9.2\r\n{code}\r\n", "updateAuthor": { "name": "smohammed", "key": "smohammed", "displayName": "Samir Mohammed", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-07-11T17:23:14.000+0000", "updated": "2018-07-11T17:23:14.000+0000" } ], "maxResults": 10, "total": 10, "startAt": 0 } } }