{"record":{"id":"9ab1a7918acc5431","repo":"stride3d/stride","slug":"playmedia-failed-mediacodecscheduler-is-null","errorCode":null,"errorMessage":"PlayMedia failed: MediaCodecScheduler is null","messagePattern":"PlayMedia failed: MediaCodecScheduler is null","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Video/Backends/MediaCodecVideoBackend.cs","lineNumber":154,"sourceCode":"\n        lock (imageReaderLock)\n        {\n            imageReader?.Close();\n            imageReader = null;\n        }\n\n        if (rgbaScratch != IntPtr.Zero)\n        {\n            Marshal.FreeHGlobal(rgbaScratch);\n            rgbaScratch = IntPtr.Zero;\n            rgbaScratchSize = 0;\n        }\n    }\n\n    public override void Play()\n    {\n        if (mediaSynchronizer == null || mediaCodecVideoExtractor == null)\n            throw new InvalidOperationException(\"PlayMedia failed: MediaCodecScheduler is null\");\n        mediaSynchronizer.Play();\n    }\n\n    public override void Pause()\n    {\n        if (mediaSynchronizer == null)\n            throw new InvalidOperationException(\"PauseMedia failed: MediaCodecScheduler is null\");\n        mediaSynchronizer.Pause();\n    }\n\n    public override void Stop()\n    {\n        mediaSynchronizer.Stop();\n    }\n\n    public override void Seek(TimeSpan time)\n    {\n        if (mediaSynchronizer == null)","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Video/Backends/MediaCodecVideoBackend.cs#L136-L172","documentation":"MediaCodecVideoBackend.Play was invoked but mediaSynchronizer (or mediaCodecVideoExtractor) is null, meaning Initialize never succeeded. The message says MediaCodecScheduler but the guard is on the synchronizer/extractor; playback cannot start without them.","triggerScenarios":"Calling Play before Initialize; Initialize threw earlier (e.g. failed audio setup at Initialize) leaving fields null; Play after Dispose; calling Play on a freshly constructed backend.","commonSituations":"Calling Play on a video entity whose backend failed to load the URL; lifecycle races where Play is invoked the same frame the component was added; forgetting that Initialize must precede Play.","solutions":["Ensure Initialize succeeded before calling Play (check for swallowed exceptions)","Handle/inspect exceptions from Initialize — a null mediaSynchronizer afterwards means it failed","Do not call Play after Dispose; recreate and re-initialize the backend","Order game logic so Play happens after the video finished loading/initializing"],"exampleFix":"// before\nbackend.Play(); // throws if Initialize failed or not called\n// after\nif (!backend.Initialize(url, 0, len)) throw new InvalidOperationException(\"video load failed\");\nbackend.Play();","handlingStrategy":"validation","validationCode":"bool ready = backend.IsInitialized; // synchronizer + extractor created\nif (ready) backend.Play();","typeGuard":"bool CanPlay(MediaCodecVideoBackend b) => b.IsInitialized;","tryCatchPattern":"try { backend.Play(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"failed: MediaCodecScheduler is null\"))\n{ /* surface load failure; re-initialize backend */ }","preventionTips":["Check Initialize's success before enabling Play UI","Don't swallow Initialize exceptions — a later Play will explode","Disable playback controls until the backend reports ready"],"tags":["android","mediacodec","video","lifecycle"],"backgroundTag":"invalid-state-transition","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}