1

我目前正在 Android 上制作音频流应用程序。我正在使用 Android NDK 和 ffmpeg 来执行它到目前为止运行良好。

现在我想在流式传输时检索标题流中包含的广播元数据。显然 ffmpeg 没有提供直接的方法来做到这一点,但我很确定在技术上可以从流中检索 HTTP 标头,因为我们在流式传输时接收所有字节。

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

4

2 回答 2

2

如果您正在寻找广播元数据......
从 FFmpeg 2.0 开始,就有对它们的内置支持。这是公开相关 AVOptions的http 协议。

执行

icy AVOption调用时将 设置为 1 avformat_open_input。这将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_packetoricy_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/

更多信息

在提出补丁的邮件列表中查找更多信息。
这些选项是AVClass在 HTTP 和 HTTPS 上下文(代码)上定义的。

于 2014-01-07T18:55:59.577 回答
1

这涉及对http响应的2个单独操作,与android-ffmpeg关系不大。

请参见此处的“1.1.3”、“1.1.6”部分

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

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

于 2013-03-07T02:53:38.760 回答