{"record":{"id":"43778977e750f320","repo":"bilibili/flv.js","slug":"nativeplayer-does-t-support-flv-mediadatasource-in","errorCode":null,"errorMessage":"NativePlayer does't support flv MediaDataSource input!","messagePattern":"NativePlayer does't support flv MediaDataSource input!","errorType":"validation","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/player/native-player.js","lineNumber":38,"sourceCode":"import PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n    constructor(mediaDataSource, config) {\n        this.TAG = 'NativePlayer';\n        this._type = 'NativePlayer';\n        this._emitter = new EventEmitter();\n\n        this._config = createDefaultConfig();\n        if (typeof config === 'object') {\n            Object.assign(this._config, config);\n        }\n\n        if (mediaDataSource.type.toLowerCase() === 'flv') {\n            throw new InvalidArgumentException('NativePlayer does\\'t support flv MediaDataSource input!');\n        }\n        if (mediaDataSource.hasOwnProperty('segments')) {\n            throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n        }\n\n        this.e = {\n            onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n        };\n\n        this._pendingSeekTime = null;\n        this._statisticsReporter = null;\n\n        this._mediaDataSource = mediaDataSource;\n        this._mediaElement = null;\n    }\n\n    destroy() {\n        if (this._mediaElement) {","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/bilibili/flv.js/blob/42343088f22619cf014a057b3878fe3d320016a6/src/player/native-player.js#L20-L56","documentation":"NativePlayer handles browser-native formats (mp4, etc.) via the HTMLMediaElement directly. Its constructor throws InvalidArgumentException when mediaDataSource.type is 'flv', since FLV demuxing requires FlvPlayer, and also rejects multipart ('segments') sources. It is a format-capability guard.","triggerScenarios":"new NativePlayer({type: 'flv', url: ...}) or using flvjs.createPlayer with is flv forced such that NativePlayer is selected for an flv dataSource, in the constructor (src/player/native-player.js:38).","commonSituations":"Explicitly instantiating NativePlayer while reusing an FLV config, a config factory that always sets type 'flv', or passing an FLV source to the wrong player class after a refactor.","solutions":["Use flvjs.createPlayer(mediaDataSource) and let the factory choose: flv -> FlvPlayer, others -> NativePlayer.","For FLV playback with FlvPlayer, set type: 'flv' and instantiate FlvPlayer.","Remove explicit `new NativePlayer(...)` calls for FLV sources."],"exampleFix":"// before\nconst player = new flvjs.NativePlayer({type: 'flv', url: 'stream.flv'});\n// after\nconst player = flvjs.createPlayer({type: 'flv', url: 'stream.flv'}); // returns FlvPlayer","handlingStrategy":"validation","validationCode":"function createCorrectPlayer(ds) {\n    if (ds && typeof ds.type === 'string' && ds.type.toLowerCase() === 'flv') {\n        return flvjs.createPlayer(ds); // FlvPlayer\n    }\n    if (ds && Array.isArray(ds.segments)) {\n        throw new Error('NativePlayer does not support multipart playback');\n    }\n    return flvjs.createPlayer(ds); // NativePlayer\n}","typeGuard":"function isNativeCompatibleSource(ds) {\n    return !!ds && typeof ds.type === 'string' &&\n        ds.type.toLowerCase() !== 'flv' &&\n        !Object.prototype.hasOwnProperty.call(ds, 'segments');\n}","tryCatchPattern":"try {\n    player = new flvjs.NativePlayer(ds);\n} catch (e) {\n    if (/doesn't support flv MediaDataSource/.test(e.message)) {\n        player = flvjs.createPlayer(ds);\n    } else throw e;\n}","preventionTips":["Route all player creation through flvjs.createPlayer.","Keep one source-of-truth config for type and never override it per player class.","Reject 'segments' in NativePlayer configs upstream of construction."],"tags":["player","config","argument-validation","flv"],"backgroundTag":"invalid-media-data-source","analyzedSha":"42343088f22619cf014a057b3878fe3d320016a6","analyzedAt":"2026-09-01T00:27:28.147Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}