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 |
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.
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.
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.
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
|
I intend to glance around to see whether sending video to the phone is easier in 2026 - after release of VHA |
Huge thank you to @cal2195 for his code 🙇
This code comes from his
transcoding-videobranch 🥇This is meant to be released in tandem with whyboris/Video-Hub-App-remote#9 🤝
Help wantedupdate: Thank you @cal2195 for the
on-finishedsuggestion -- 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
spawning a newffmpegprocess, 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).