我目前正在 Android 上制作音频流应用程序。我正在使用 Android NDK 和 ffmpeg 来执行它到目前为止运行良好。
现在我想在流式传输时检索标题流中包含的广播元数据。显然 ffmpeg 没有提供直接的方法来做到这一点,但我很确定在技术上可以从流中检索 HTTP 标头,因为我们在流式传输时接收所有字节。
有谁知道如何使用 ffmpeg 从流中检索 HTTP 标头?
我目前正在 Android 上制作音频流应用程序。我正在使用 Android NDK 和 ffmpeg 来执行它到目前为止运行良好。
现在我想在流式传输时检索标题流中包含的广播元数据。显然 ffmpeg 没有提供直接的方法来做到这一点,但我很确定在技术上可以从流中检索 HTTP 标头,因为我们在流式传输时接收所有字节。
有谁知道如何使用 ffmpeg 从流中检索 HTTP 标头?
如果您正在寻找广播元数据......
从 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_packet
oricy_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/
这涉及对http响应的2个单独操作,与android-ffmpeg关系不大。
请参见此处的“1.1.3”、“1.1.6”部分
假设您在 android 中使用 HttpClient 的默认实现,则 api 非常相似。有一个用于 android 的 bridge 包,它包装了我的示例中使用的 apache httpclient 库。
当你得到响应时,你做一件事来获取响应头(见链接),然后做另一件事来获取 ENTITY 中的流对象,然后使用 JNI 将 ptr 传递给该流到来自 ffmpeg 的 I/O .