rsnext/examples/with-mux-video/components/video-player.js
Dylan Jhaveri 32dece149e
Add example: with-mux-video (#13120)
* yarn create next-app

* create an upload show page

* create upload page to handle in-progress upload and asset when it is ready

* move things to a layout component

* add some button styling

* poll for updates intelligently by dynamically setting refreshInterval on SWR hook

* better title

* edit gitignore, add MIT license use next 'latest'

based on feedback from https://github.com/zeit/next.js/pull/12723

* add some messages and spinner to make this a little nicer

* update README with environment variables info and Mux account info

* add .now to gitignore

* cleaner uploading state - redirect to /v/:playback_id when complete

* hardset image width in footer

* remove unused styles

* adjust title font size on mobile and adjust footer height on mobile

* use upchunk 1.0.8 so we don't have to dynamically load it

* cleaner error message handling

* fix brief error from returning Router on the render

* yarn lint-fix

* update README with note about .env.local

* add min height so the layout doesn't shift after selecting a file

* set poster attribute at video element

* use getStaticProps and fallback:true to render meta tags for social sharing

* create a pages/asset/:id route that we can be on while in the preparing state

* add copy about Mux, add twitter share widget

* add flash message about video ready for playback

* call it pre-rendered instead of server-side rendered

* pre-rendering, not server-side rendering

* Next.js not NextJS

* handle asset creation errors in the UI

* call hls.destroy() when the component is unmounted

* Updated readme and renamed .env.local

* Updated description

* add suggested patch with links to source code https://github.com/zeit/next.js/pull/13120#issuecomment-632858572

* Added vercel.json

* Updated some links

* Removed Prerequisites

Co-authored-by: Luis Alvarez <luis@vercel.com>
2020-05-22 16:13:12 -05:00

49 lines
1.1 KiB
JavaScript

import { useEffect, useRef } from 'react'
import Hls from 'hls.js'
export default function VideoPlayer({ src, poster }) {
const videoRef = useRef(null)
useEffect(() => {
const video = videoRef.current
if (!video) return
video.controls = true
let hls
if (video.canPlayType('application/vnd.apple.mpegurl')) {
// This will run in safari, where HLS is supported natively
video.src = src
} else if (Hls.isSupported()) {
// This will run in all other modern browsers
hls = new Hls()
hls.loadSource(src)
hls.attachMedia(video)
} else {
console.error(
'This is an old browser that does not support MSE https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API'
)
}
return () => {
if (hls) {
hls.destroy()
}
}
}, [src, videoRef])
return (
<>
<video ref={videoRef} poster={poster} />
<style jsx>{`
video {
width: 800px;
max-width: 100%;
cursor: pointer;
padding-top: 40px;
padding-bottom: 40px;
}
`}</style>
</>
)
}