如何从ffmpeg中的流中检索HTTP标头?

时间:2013-03-06 10:40:10

标签: ffmpeg metadata icecast libavformat

我目前正在Android上制作音频流媒体应用。我正在使用Android NDK和ffmpeg一起执行它到目前为止工作得很好。

现在我想在流式传输时检索标头流中包含的shoutcast元数据。显然ffmpeg没有提供直接的方法,但我很确定从流中检索HTTP标头在技术上是可行的,因为我们在流式传输时接收所有字节。

有没有人知道如何使用ffmpeg从流中检索HTTP标头?

2 个答案:

答案 0 :(得分:2)

如果您正在寻找shoutcast metadata ...
自FFmpeg 2.0以来,它们内置了支持。这是公开相关AVOptions的http protocol

实施

调用icy AVOption时将avformat_open_input设置为1。这将在打开流时设置Icy-MetaData HTTP标头:

AVDictionary *options = NULL;
av_dict_set(&options, "icy", "1", 0);
AVFormatContext* container = avformat_alloc_context();
int err = avformat_open_input(&container, url, NULL, &options);

然后轮询您的上下文中的icy_metadata_packeticy_metadata_headers AVOption以检索当前元数据:

char* metadata = NULL;
av_opt_get(container, "icy_metadata_packet", AV_OPT_SEARCH_CHILDREN, (uint8_t**) &metadata);
printf("icy_metadata_packet: %s\n", metadata);
av_free(metadata);
metadata = NULL;
av_opt_get(container, "icy_metadata_headers", AV_OPT_SEARCH_CHILDREN, (uint8_t**) &metadata);
printf("\nicy_metadata_headers:\n%s\n", metadata);
av_free(metadata);

接下来,您可能希望将元数据信息提供到Android应用的Java层。我不熟悉NDK,所以你必须自己解决这个问题;)

示例输出

icy_metadata_packet: StreamTitle='Zelda Reorchestrated - Twilight Symphony - Gerudo Desert';

icy_metadata_headers:
icy-br: 192
icy-description: Radio Hyrule
icy-genre: Remix
icy-name: Radio Hyrule
icy-pub: 1
icy-url: http://radiohyrule.com/

更多信息

了解有关提出补丁的mailing list的更多信息 这些选项在AVClass上为HTTP和HTTPS上下文(code)定义。

答案 1 :(得分:1)

这涉及到对http响应的两个单独操作,与android-ffmpeg没什么关系。

请参阅“1.1.3”,“1.1.6”here

部分

假设你在android中使用HttpClient的默认实现,api非常相似。有一个用于android的桥接包,包装了我的示例中使用的apache httpclient库。

当你得到响应时,你做一件事来获取响应头(请参阅链接)然后另一件事来获取ENTITY中的流对象然后使用JNI将ptr传递给该流到I /来自ffmpeg的O.