我目前正在Android上制作音频流媒体应用。我正在使用Android NDK和ffmpeg一起执行它到目前为止工作得很好。
现在我想在流式传输时检索标头流中包含的shoutcast元数据。显然ffmpeg没有提供直接的方法,但我很确定从流中检索HTTP标头在技术上是可行的,因为我们在流式传输时接收所有字节。
有没有人知道如何使用ffmpeg从流中检索HTTP标头?
答案 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_packet
或icy_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.