FFMPEG:Transmux mpegts到mp4给出错误:muxer不支持非可搜索输出

时间:2015-12-06 21:53:48

标签: ffmpeg video-streaming mp4 transcoding mpeg-dash

当将mpegts发送到ffmpeg时,它应该将其转换为mp4并将其转换为stdout,ffmpeg说:“muxer不支持非可搜索输出”。

经过很多的研究后,我得出的结论是mp4是一个不好的选择,可以通过搜索来进行那些类型的即时转码。所以从本质上说:MP4不能通过ffmpeg进行管道传输,这是有道理的。

但我没有连续的mpegts流,我有5秒钟的块。 所以它真的就像:

  • 这是我的1 MB * .ts文件
  • 请从管道读取,直到您点击EOF
  • 请将其转换为mp4(如果你真的需要寻找,请使用缓冲区)
  • 请将完整的内部mp4缓冲区传输到stdout

我需要这些mp4块用于HTML5 MediaSource,碎片没有问题,我使用mp4box.js,它就像一个魅力。

问题:

  • FFMPEG可以做这种内部缓冲吗?
  • 还有更好的选择吗?

本质上:我可以(不知何故)与ffmpeg交互而不使用文件吗?我目前的解决方案适用于文件和轮询新的块,这很难看。

如果您对我的ffmpeg命令感兴趣,请告诉我。

2 个答案:

答案 0 :(得分:13)

由于您提到了碎片,因此您可以使用movflags启用碎片。从每个关键帧开始的片段示例:

ffmpeg -i segment.ts -c copy -movflags frag_keyframe+empty_moov -f mp4 -

拥有一个空的moov原子意味着它不需要寻找,因此可以使用管道。

答案 1 :(得分:0)

如果您可以忍受没有真正的mp4格式,那么使用ismv实际上对我来说甚至更好(对某些玩家而言,没有寻求损害和总时长信息)比手动调整{ {1}}。根据{{​​3}},movflags格式与ismv类似,但是自动调整mp4进行流传输,并在我看来做得更好。

经过以下测试:Firefox,Chrome,VLC

movflags

遗憾的是,由于Twitter的视频上传有效期非常严格,并且要求我以{{1}最常见的方式,因此该命令和ffmpeg formats documentation都无法创建兼容于19/12/20的视频上传到Twitter }}格式。因此,到目前为止,我仍然必须使用ffmpeg -i input.mp4 -f ismv - 直接输出到文件,而不是使用mp4来上传Twitter视频。但是我很想听听是否有人想出办法解决这个问题!