media-trimmer
Version:
A simple WebM and MP4 video trimmer using the WebCodecs API
89 lines (66 loc) • 2.84 kB
Markdown
# A video trimmer in the browser
[<img src="https://miru.media/media-trimmer-screenshot.jpg" alt="Screenshot">](https://miru.media/video-trimmer)
<https://miru.media/video-trimmer>
<!-- #region main -->
```sh
npm install media-trimmer
```
```js
import { trim } from 'media-trimmer'
try {
// The input video must be a `.mp4`/`.mov` file with a video track
// and the browser must support video encoding with the WebCodecs API
await trim('video.mp4', {
start: 2, // start time in seconds
end: 10, // end time in seconds
mute: false, // ignore the audio track?
})
} catch (error) {
alert(error)
}
```
It also comes with a Web Component UI:
```html
<!-- after importing the library, the <media-trimmer> custom element will be defined -->
<media-trimmer id="trimmer"></media-trimmer>
<button id="export" type="buton">Get trimmed video</button>
<input id="input" type="file" accept="video/*" />
<progress id="export-progress" max="1"></progress>
<script type="module">
const trimmer = document.getElementById('trimmer')
const input = document.getElementById('input')
const button = document.getElementById('export')
const progress = document.getElementById('export-progress')
// use the file that the user picks
input.addEventListener('input', (event) => {
trimmer.source = event.target.files[0]
})
// save the trimmed video to a file
button.addEventListener('click', async () => {
const blob = await trimmer.toBlob()
const anchor = document.createElement('a')
const blobUrl = URL.createObjectURL(blob)
anchor.href = blobUrl
anchor.target = '_blank'
anchor.download = 'trimmed.webm'
anchor.dispatchEvent(new MouseEvent('click'))
URL.revokeObjectURL(blobUrl)
})
// display the trimming progress
trimmer.addEventListener('progress', (event) => (progress.value = event.target.progress))
</script>
```
Powered by:
- [Mediabunny](https://mediabunny.dev/)
- [WebCodecs API](https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API)
## Roadmap
- [ ] Lossless trimming
- [ ] Bitrate/filesize controls
- [x] Webm support
- [ ] Color profile preservation
- [ ] Increased browser and codec support via [LibAVJS-WebCodecs-Polyfill](https://github.com/ennuicastr/libavjs-webcodecs-polyfill)
<!-- #endregion main -->
## Funding
This project is funded through [NGI Zero Core](https://nlnet.nl/core), a fund established by [NLnet](https://nlnet.nl) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu) program. Learn more at the [NLnet project page](https://nlnet.nl/project/Miru).
[<img src="https://nlnet.nl/logo/banner.png" alt="NLnet foundation logo" width="20%" />](https://nlnet.nl)
[<img src="https://nlnet.nl/image/logos/NGI0_tag.svg" alt="NGI Zero Logo" width="20%" />](https://nlnet.nl/core)