-
-
Notifications
You must be signed in to change notification settings - Fork 184
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Transcode server for remote #611
base: main
Are you sure you want to change the base?
Conversation
Sounds like you're correct - we need something like this to catch the connection closed event, and then |
Also note, for MOV/MP4/ISMV (Smooth Streaming) muxer, |
@cal2195 the FFmpeg documentation seems confusing 😅
Also, microseconds !?!! 😱 that's 1,000,000 microseconds in 1 second ... that's a million ... they must have messed up in the documentation, right? Especially that they allow fractional value ... right? 😖 |
The one that is in seconds is for the dash muxer, each muxer had it's own options. :) Only the one in seconds allows fractional values. We want the mp4 muxer, which is in microseconds! 😄 |
I don't know what's a sensible values (as measured in seconds is). Is there a way to tell whether the value affects anything? I can't see any difference whether it was Sorry to ask about questions that I should be able to research on my own -- but the documentation is so terse 😕 I glanced around online (not too long, just a quick search) and found nothing of value to explain. Or if it's easier, please let me know how you figured this stuff out 🙇 |
'-crf', '17', | ||
'-preset', 'ultrafast', | ||
'-movflags', 'frag_keyframe+empty_moov+faststart', | ||
'-frag_duration', '15', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can probably remove this - I think it might have a sensible default anyway. We can change it later.
The idea with fragmenting, is that you can seek and stream much easier, without having to download the entire mp4 file before playback can begin. Each fragment contains metadata about the video, rather than all the metadata being store at the end of the file!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can look into finding the best options, but if the code works as is, may as well use that for now!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks Cal for looking at this again. I've paused this feature for a while because I had at least two days of trying hard with no success: getting the video to play in Chrome ✅ no problem 👌 but getting Safari on iOS (on my phone) to play anything was a no-go 😓 which is the sole purpose of this feature.
I'll come back to this with renewed energy once I move in to the new house (these few months have been busy).
😅 also I've been working on an image-centric analogous-to-VHA app this past month -- I want to finish it first before returning to this headache
app.get('/video', (req, res) => { | ||
const seekTime = req.query.seek || 0; | ||
const file = req.query.file || ''; | ||
// see https://trac.ffmpeg.org/wiki/Encode/H.264#a2.Chooseapreset for more options | ||
const ffmpeg = spawn(ffmpegPath, [ | ||
'-ss', seekTime, | ||
'-i', file, | ||
'-f', 'mp4', | ||
'-crf', '17', | ||
'-preset', 'ultrafast', | ||
'-movflags', 'frag_keyframe+empty_moov+faststart', | ||
'-frag_duration', '15', | ||
'pipe:1' | ||
]); | ||
res.writeHead(200, { | ||
'Content-Type': 'video/mp4' | ||
}); | ||
ffmpeg.stdout.pipe(res); | ||
// error logging | ||
ffmpeg.stderr.setEncoding('utf8'); | ||
ffmpeg.stderr.on('data', (data) => { | ||
console.log(data); | ||
}); | ||
onFinished(res, () => { | ||
console.log('about to kill!'); | ||
ffmpeg.kill(); | ||
}); | ||
}); |
Check failure
Code scanning / CodeQL
Missing rate limiting High
a system command
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix AI 2 months ago
To fix the problem, we will introduce rate limiting to the Express application using the express-rate-limit
package. This will limit the number of requests to the /video
endpoint, preventing abuse and potential DoS attacks.
- Install the
express-rate-limit
package. - Import the
express-rate-limit
package in thenode/server.ts
file. - Set up a rate limiter with appropriate configuration (e.g., maximum of 100 requests per 15 minutes).
- Apply the rate limiter to the
/video
endpoint.
-
Copy modified line R6 -
Copy modified lines R91-R95 -
Copy modified line R112
@@ -5,2 +5,3 @@ | ||
const express = require('express'); | ||
const rateLimit = require('express-rate-limit'); | ||
// const bodyParser = require('body-parser'); ----------------------------- disabled | ||
@@ -89,2 +90,7 @@ | ||
|
||
const videoLimiter = rateLimit({ | ||
windowMs: 15 * 60 * 1000, // 15 minutes | ||
max: 100 // limit each IP to 100 requests per windowMs | ||
}); | ||
|
||
// app.use(bodyParser.json()); // to handle JSON POST requests ------ disabled | ||
@@ -105,3 +111,3 @@ | ||
|
||
app.get('/video', (req, res) => { | ||
app.get('/video', videoLimiter, (req, res) => { | ||
const seekTime = req.query.seek || 0; |
-
Copy modified lines R64-R65
@@ -63,3 +63,4 @@ | ||
"tslib": "2.8.0", | ||
"ws": "8.18.0" | ||
"ws": "8.18.0", | ||
"express-rate-limit": "^7.4.1" | ||
}, |
Package | Version | Security advisories |
express-rate-limit (npm) | 7.4.1 | None |
Huge thank you to @cal2195 for his code 🙇
This code comes from his
transcoding-video
branch 🥇This is meant to be released in tandem with whyboris/Video-Hub-App-remote#9 🤝
Help wantedupdate: Thank you @cal2195 for the
on-finished
suggestion -- I think it fixed the below problemWhen running this branch in tandem with the Remote - after a little bit (playing the video 10-20 times) the server fails:
I messed on my PC with the pagefile settings, so it could be me. But I also wonder if, since for every HTTP request that comes to this server, we're
spawn
ing a newffmpeg
process, and perhaps never killing it, something goes wrong? 😅Help still wanted:
Also, I set
'-frag_duration', '15'
to test a different value, but originally it was3600
... I'm unsure about what it's meant to do - the unit is seconds, and 3600 is 1 hour which seems awfully long (though I still don't understand what the flag does) 😅Documentation is conflicting (see comment in discussion below).