如何使用 avformat (ffmpeg) 写入 Icecast 挂载点?

How to write to Icecast mount point with avformat (ffmpeg)?

我正在构建一个程序(我想使用 libavformat 而不是 ffmpeg 可执行文件)将实时视频流式传输到 Icecast 服务器,看起来 FFmpeg 应该能够做到这一点。我可以将实时视频写入文件(开始时并不是很简单:))但是我找不到简单的代码/示例来说明如何使用 avformat/avio 写入 Icecast(网络)挂载点。 任何指向示例代码的指针都将不胜感激。

使用 FFmpeg 时,将输出指定为 icecast:// URL:

ffmpeg -i input.mkv -content-type video/webm icecast://user:password@hostname.tld/mountpoint

不清楚你是直接使用ffmpeg还是libavformat;但是,如果在后一种情况下有办法为输出指定 URL,只需在它前面加上 icecast:// 我会假设。

另一种选择是使用libshout;它是一个库,旨在以适当的速率将流发送到 Icecast 服务器。

其实很简单。您只需打开输出 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);

那么你只要打开 URL:

avio_open2(&out_fctx->pb, outputfile, AVIO_FLAG_WRITE, NULL, &out_options) < 0);

它已经过测试并且可以正常工作。