ボリュームなど細かい制御はやりにくくなるけど、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;
}
ども、びぁです。
返信削除rtmpdumpを何とかhaikuでmakeしたんですが、使い方がさっぱりわかりません。
それはそうと、コールバック関数内でのreadは何故かうまくいきません。
ただのファイル読込でもだめでした。(freadの戻り値が0になる)
試しに関数内でランダムにバッファを埋めるとノイズが出力されるので、
一旦別の関数でメモリに読込んでおいて、コールバック関数内でコピーするとうまくいくかもです。
びぁさんこんにちわ、村井です。
返信削除rtmpdump は例のスクリプトしかまだ使ってないです:-)
コールバック関数については、BSoundPlayer() の他の事例を見ると、rtmpdumpからの生データでなく、なにか加工したデータを与えないといけない感じがします。やはりここは安直にスペシャル版 ffmpeg を使った再生ソフトの道に行きそうです…
bufferdecorder でのaudioファイル再生に成功しました。
返信削除mp3もwavでも大丈夫。ただし、zeta上です。
haikuで走らせると、まだ、mediakitが不完全なのか、pluginが悪いのか、wavしか駄目なようです。
mediaplayerではwav,mp3,aac共、再生できているので
部分的には対応できているのかも。。。
最も簡単にファイル再生できるgamekitの方でも駄目なので
もう少し待ったほうがいいかもです。
rev43629で追試しました。
返信削除いつのまにか、だいぶ改善されたようで、
BSoundPlayerでもgamekitのBFileGameSoundでも
wav,mp3,m4aファイルの再生が可能です。
しかし、bufferdecorderでの再生は、
まだwavしか駄目みたいですね。
びぁさん、追試ありがとうございます。
返信削除環境のクリーンインストールなどで、最近Sound方面はちょっと手をつけていないですが、librtmpの出力を再生するためには、いまのところはlibavformatなどを使ってwavに変換しないといけないようですね。