2011/10/09

そしてなによりなにかが足りないの巻

テキトーに再生プログラム作ってみたけど、当然音はならないし、レイテンシが足りないとか言われちゃう。BCommandPipe から librtmp にしてみてもだめ。コールバック関数がよくないのか?

ボリュームなど細かい制御はやりにくくなるけど、ffmpeg に GUI かぶせて鳴らしたほうが楽かな…その場合は、rtmp と beosaudio を合体させたスペシャル ffmpeg を作らないといけないけど、rtmp はともかく、beosaudio をどうするか…

// 鳴らないよ。
// 注意:エラー処理とか終了処理とかはありません。

#include "App.h"
#include <SoundPlayer.h>
#include <stdio.h>
#include <string.h>
#include "rtmp.h"

#define AUDIO_BLOCK_SIZE 1024
#define AUDIO_BLOCK_COUNT sizeof(float)
#define AUDIO_BUFFER_SIZE (AUDIO_BLOCK_SIZE*AUDIO_BLOCK_COUNT)

RTMP *r;
BSoundPlayer *player;

static void
audioplay_callback(void *cookie, void *buffer, size_t bufferSize, const media_raw_audio_format &format)
{
char *buf = (char *)buffer;
RTMP_Read(r, buf, bufferSize);
}

static void
audio_open()
{
media_raw_audio_format format;

format = media_raw_audio_format::wildcard;
format.format = media_raw_audio_format::B_AUDIO_FLOAT;
format.byte_order = B_HOST_IS_LENDIAN ? B_MEDIA_LITTLE_ENDIAN : B_MEDIA_BIG_ENDIAN;
format.channel_count = 2;
format.buffer_size = AUDIO_BUFFER_SIZE;
format.frame_rate = 48000;

player = new BSoundPlayer(&format, "test", audioplay_callback, NULL);
player->SetVolume(1.0);
player->Start();
player->SetHasData(true);

return 1;
}

static void
rtmp_open()
{
char u[] = "rtmpe://netradio-r1-flash.nhk.jp "
"playpath=NetRadio_R1_flash@63346 "
"app=Live "
"swfUrl=http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf "
"live=1";

r = RTMP_Alloc();
RTMP_Init(r);
RTMP_SetupURL(r, u);
RTMP_Connect(r, NULL);
RTMP_ConnectStream(r, 0);
}

App::App(void)
: BApplication("application/x-vnd.dw-TestApp")
{
rtmp_open();
audio_open(&s);
}

App::~App()
{
player->Stop();
delete player;
}

int
main(void)
{
App *app = new App();
app->Run();
delete app;
return 0;
}


5 件のコメント:

  1. ども、びぁです。
    rtmpdumpを何とかhaikuでmakeしたんですが、使い方がさっぱりわかりません。
    それはそうと、コールバック関数内でのreadは何故かうまくいきません。
    ただのファイル読込でもだめでした。(freadの戻り値が0になる)
    試しに関数内でランダムにバッファを埋めるとノイズが出力されるので、
    一旦別の関数でメモリに読込んでおいて、コールバック関数内でコピーするとうまくいくかもです。

    返信削除
  2. びぁさんこんにちわ、村井です。
    rtmpdump は例のスクリプトしかまだ使ってないです:-)
    コールバック関数については、BSoundPlayer() の他の事例を見ると、rtmpdumpからの生データでなく、なにか加工したデータを与えないといけない感じがします。やはりここは安直にスペシャル版 ffmpeg を使った再生ソフトの道に行きそうです…

    返信削除
  3. bufferdecorder でのaudioファイル再生に成功しました。
    mp3もwavでも大丈夫。ただし、zeta上です。

    haikuで走らせると、まだ、mediakitが不完全なのか、pluginが悪いのか、wavしか駄目なようです。
    mediaplayerではwav,mp3,aac共、再生できているので
    部分的には対応できているのかも。。。
    最も簡単にファイル再生できるgamekitの方でも駄目なので
    もう少し待ったほうがいいかもです。

    返信削除
  4. rev43629で追試しました。
    いつのまにか、だいぶ改善されたようで、
    BSoundPlayerでもgamekitのBFileGameSoundでも
    wav,mp3,m4aファイルの再生が可能です。
    しかし、bufferdecorderでの再生は、
    まだwavしか駄目みたいですね。

    返信削除
  5. びぁさん、追試ありがとうございます。
    環境のクリーンインストールなどで、最近Sound方面はちょっと手をつけていないですが、librtmpの出力を再生するためには、いまのところはlibavformatなどを使ってwavに変換しないといけないようですね。

    返信削除