如何使用 avformat (ffmpeg) 写入 Icecast 挂载点?
Posted
技术标签:
【中文标题】如何使用 avformat (ffmpeg) 写入 Icecast 挂载点?【英文标题】:How to write to Icecast mount point with avformat (ffmpeg)? 【发布时间】:2016-07-19 17:37:15 【问题描述】:我正在构建一个程序(我想使用 libavformat 而不是 ffmpeg 可执行文件)将实时视频流式传输到 Icecast 服务器,看起来 FFmpeg 应该能够做到。我可以将实时视频写入文件(开始时并不简单:))但我找不到简单的代码/示例来说明如何使用 avformat/avio 写入 Icecast(网络)挂载点。 任何指向示例代码的指针都将不胜感激。
【问题讨论】:
有点过时了,但请看这个:***.com/a/9985297/362536 现在变得更容易了……您可以使用 HTTP PUT 请求而不是 SOURCE 请求。 【参考方案1】:使用 FFmpeg 时,您将输出指定为 icecast:// URL:
ffmpeg -i input.mkv -content-type video/webm icecast://user:password@hostname.tld/mountpoint
不清楚你是直接使用ffmpeg还是libavformat;不过,如果有办法在后一种情况下为输出指定 URL,我会假设只需在其前面加上 icecast://。
另一种选择是改用libshout;它是一个设计用于以适当的速率将流发送到 Icecast 服务器的库。
【讨论】:
这就是为什么我说我正在构建一个程序(不使用 ffmpeg 可执行文件)。而且libshout在windows下编译是一团糟。我什至不想进入那个:)【参考方案2】:其实很简单。您只需打开输出 URL,其中 "xxx:yyy" 是安装的用户和密码:
const char *outputfile = "icecast://xxx:yyy@10.0.0.1:8000/xyz.mkv";
out_format = av_guess_format(NULL, outputfile, NULL);
您可能需要设置内容类型:
av_dict_set(&out_options, "content_type", "video/x-matroska", 0);
然后你只要打开网址:
avio_open2(&out_fctx->pb, outputfile, AVIO_FLAG_WRITE, NULL, &out_options) < 0);
它已经过测试并且可以正常工作。
【讨论】:
以上是关于如何使用 avformat (ffmpeg) 写入 Icecast 挂载点?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 avformat_open_input 函数(ffmpeg)
FFmpeg之avformat_alloc_context()
从头用脚分析FFmpeg源码 - avformat_write_header