如何通过http协议使用ffmpeg进行流媒体传输

21

我正在进行一个流程,它应该在Flowplayer中正确显示。首先,我将其通过RTP发送到另一台电脑。在这里,我还使用VLC检查编解码器等是否正确到达,结果是正确的。

现在,我想将此流公开为文件,以便可以通过Flowplayer显示,我使用VLC中的某些内容:http://localhost:8080/test.mp4,例如。

我得到的完整命令是:ffmpeg -i input -f mp4 http://localhost:8080/test.mp4

但是,无论我如何尝试,都只会收到输入/输出错误。这只能通过像ffserver或其他方式实现吗?

我认为这不起作用是因为ffmpeg不能充当服务器;在VLC上它行得通,因为它可以。(尽管VLC破坏我设置的编解码器,之后出于某种原因无法读取)

我可以使用一种(有点)变通方法,即将RTP流保存到文件中,然后让flowplayer加载它。但是,只有一旦文件不再被访问,它才能正常工作;否则我会收到编解码器错误。


1
查看文档:https://trac.ffmpeg.org/wiki/StreamingGuide - Robert Rowntree
我已经阅读了几遍,但它没有解决我的具体问题。 - Boehmi
如果您正在尝试进行实时流传输,请使用FLV而不是MP4:ffmpeg -i input -c:v libx264 -maxrate 1000k -bufsize 2000k -g 50 http://localhost:8080/test.flv。另请参阅http://trac.ffmpeg.org/wiki/EncodingForStreamingSites。 - llogan
你修好了吗? - Cito
@Cito 我之前不是,但现在我正在通过HTTP创建m3u8播放列表,Flowplayer可以使用插件读取它们。效果非常好。 - Boehmi
显示剩余4条评论
2个回答

9
要让FFmpeg作为HTTP服务器,需要传递选项“-listen 1”。另外,“-f mp4”会导致非分段的MP4文件,不适合流媒体。可以使用“-movflags frag_keyframe+empty_moov”获取分段MP4文件。完整的命令行为:
ffmpeg -i input -listen 1 -f mp4 -movflags frag_keyframe+empty_moov http://localhost:8080

其他一些有用的选项包括:-re 限制流式传输速度与输入帧率相同,-stream_loop -1 循环播放输入内容,-c copy 避免重新编码。


1
当我执行此操作时,ffmpeg会显示一堆行,然后是“handler_name:VideoHandler”,然后闲置。我似乎无法从另一台计算机播放流。当我尝试使用vlc播放时,日志中显示:“没有匹配的access_demux模块”。有什么建议吗? - captcha

-3

你需要这个命令行

ffmpeg -f v4l2 -s 320x240 -r 25 -i /dev/video0 -f alsa -ac 1 -i hw:0 http://localhost:8090/feed1.ffm

确保您的 feed 名称以 ".ffm" 结尾,如果不是这样,请在您的 feed URL 前添加 "-f ffm",手动指定输出格式(因为ffmpeg将无法自动确定),像这样:"-f ffm http://localhost:8090/blah.bleh"。

2
在输入视频文件时出现错误,错误信息为“不适当的设备ioctl”。 - Arpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接