rsnext/examples/with-mux-video/components/video-player.js

50 lines
1.1 KiB
JavaScript
Raw Normal View History

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 23:13:12 +02:00
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>
</>
)
}