问题
When piping mpegts to ffmpeg, which should convert it to mp4 and pipe to stdout, ffmpeg says: "muxer does not support non seekable output".
After a lot of research I came to the conclusion that mp4 is a bad choice for doing those kinds of on-the-fly transcoding due to seeking. So in essence: MP4 cannot be piped through ffmpeg, which kind of makes sense.
But I do not have a contiguous mpegts stream, I have chunks of 5 seconds. So it's really just like:
- Here is my 1 mb *.ts file
- Please read it from pipe until you hit EOF
- Please transmux it to mp4 (if you really have to seek, well use a buffer)
- Please pipe the complete internal mp4 buffer to stdout
I need these mp4 chunks for a HTML5 MediaSource, the fragmentation is no problem, I use mp4box.js, which works like a charm.
Questions:
- Can FFMPEG do this kind of internal buffering ?
- Is there any better option to consider ?
In essence: Can I (somehow) interact with ffmpeg without using files ? My current solutions works with files and polling for new chunks, which is ugly.
If you are interested in my ffmpeg command, just let me know.
回答1:
Since you mentioned fragmentation then you can just enable it with movflags
. Example for fragments starting on each keyframe:
ffmpeg -i segment.ts -c copy -movflags frag_keyframe+empty_moov -f mp4 -
Having an empty moov
atom means it doesn't need to seek and thus works with a pipe.
回答2:
If you can live with not having a true mp4
format, using ismv
actually worked even better for me (didn't damage seeking and total duration info in certain players) than manually adjusting the movflags
. According to the ffmpeg formats documentation, the ismv
format is similar to mp4
, but auto adjusts the movflags
for streaming and does a better job of it in my opinion.
Tested in: Firefox, Chrome, VLC
ffmpeg -i input.mp4 -f ismv -
Sadly neither this command nor aergistal's answer create a video compatible for upload to twitter as of 19/12/20 due to twitter's video upload validaiton being very strict and requiring what I imagine is the most common of mp4
formats. So as of right now I still have to use ffmpeg
to output directly to a file rather than stdout
to allow for twitter video upload. But I would love to hear if anyone has figured out a way around this!
来源:https://stackoverflow.com/questions/34123272/ffmpeg-transmux-mpegts-to-mp4-gives-error-muxer-does-not-support-non-seekable