如何使用 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 Tips 如何中断阻塞的网络线程

从头用脚分析FFmpeg源码 - avformat_write_header

FFmpeg-使用avformat_find_stream_info()来探测获取封装格式的上下文信息

从学龄前开始解读FFMPEG代码 之 avformat_find_stream_info函数四