1

現在、Android でオーディオ ストリーミング アプリを作成しています。私は Android NDK を ffmpeg と組み合わせて使用​​しており、これまでのところかなりうまく機能しています。

現在、ストリーミング中にヘッダー ストリームに含まれるshoutcast メタデータを取得したいと考えています。どうやら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_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/

詳しくは

パッチが提案されたメーリング リストで詳細を確認してください。
オプションはAVClass、HTTP および HTTPS コンテキスト ( code ) に対して定義されます。

于 2014-01-07T18:55:59.577 に答える
1

これには、http 応答に対する 2 つの個別の操作が含まれますが、android-ffmpeg とはあまり関係ありません。

ここのセクション「1.1.3」、「1.1.6」を参照してください

Android で HttpClient のデフォルト実装を使用していると仮定すると、API は非常に似ています。私の例で使用されている apache httpclient ライブラリをラップする android 用のブリッジ パッケージが使用されています。

応答を取得したら、応答ヘッダーを取得するために1つのことを行い(リンクを参照)、次にENTITYでストリームオブジェクトを取得するために別のことを行い、次にJNIを使​​用してptrをそのストリームに渡し、ffmpegからI/Oに渡します.

于 2013-03-07T02:53:38.760 に答える