## **Step 1:** Add & configure your Bitmovin Player
First, we need to add our component library to your app. To do that create a `ComponentLibrary
` node.
Next, start the download of the component library by adding it to your scene and check for the download being finished by observing the `loadStatus
` field.
Once the download of the library is complete you can create an instance of the player.
And finally, add the Bitmovin Player License Key to your channel `manifest
`:
You can find your license key in your [Bitmovin Dashboard](🔗) under **"Player" -> "Licenses"**. This security mechanism protects your license from being used elsewhere.
## **Step 2:** Replace native video node references in your project
Remove all instances of `roSGNode
` of type `Video
` from your app and use the Bitmovin Player instead. You can use the same `contentNode
` you have been using before.
Note
It is good practice to only ever have one instance of a video node on Roku, be that a native one or the Bitmovin one, to avoid conflicts between the two as well as unexpected behaviours.
## **Summary**
In this guide, we demonstrated how easy it is to migrate from the Native Video Node to the Bitmovin Player in just **two simple steps**: adding the Bitmovin Player and simply replacing the video node with it.
Next, you can
check out our [Getting Started Guide](🔗).
download fully working [examples](🔗) and explore more features in our GitHub repository.
choose additional platforms to deploy on in our [Getting Started Hub](🔗) and try our no-code wizards.
browse our [Bitmovin Player API reference](🔗).
try our [Analytics](🔗) product to get real-time insights into your new Roku Player.
see if some of the questions you might have are answered in our [Community](🔗) and ask your own!
## **Appendix:** Mapping Tables
For more advanced use cases, we've created the following mapping tables to support your migration.
### `Video
` node ➡️ `Player
` function mapping
Video Node | Bitmovin Player |
`video.content = contentNode ` | `bitmovinPlayer.callFunc("load", contentNode) ` or
`bitmovinPlayer.callFunc("load", bitmovinSourceConfig) ` |
`video.control = "play" ` | `bitmovinPlayer.callFunc("play", invalid) ` |
`video.control = "pause" ` | `bitmovinPlayer.callFunc("pause", invalid) ` |
`video.control = "stop" ` | `bitmovinPlayer.callFunc("unload", invalid) ` |
`video.seek = target ` | `bitmovinPlayer.callFunc("seek", target) ' For VoD content `
`bitmovinPlayer.callFunc("timeShift", target) ' For live content ` |
`video.duration ` | `bitmovinPlayer.callFunc("getDuration", invalid) ` |
`video.mute = true ` and
`video.mute = false ` | `bitmovinPlayer.callFunc("mute", invalid) ` and
`bitmovinPlayer.callFunc("unmute", invalid) ` |
For a full list of all available functions check out our [Bitmovin Player API reference](🔗).
### `Video
` node ➡️ `Player
` field mapping
Video Node | Bitmovin Player |
`video.state ` | `bitmovinPlayer.playerState ` |
`video.errorCode `, `video.errorMsg `, `video.errorStr ` | `bitmovinPlayer.error.code `, `bitmovinPlayer.error.message `, `bitmovinPlayer.error.name ` |
`video.position ` | `bitmovinPlayer.timeChanged ` |
`video.timedMetaData ` | `bitmovinPlayer.metadata ` |
For a full list of all available fields check out our [Bitmovin Player API reference](🔗).