2011/10/22

ぴちぴちぴっちの巻

例の (?) 再生プログラムですが、びぁさんから wavファイルで再生に成功した報告を頂いたので、librtmp 付き改造をした ffmpeg を使って試してみました。ちょっとピッチが合っていないようですが、何か鳴っているようです。パラメータなどいじってちゃんと鳴るようになってから、コールバック関数を考えましょう…
// なにか鳴るっぽい
// 注:終了処理、エラー処理などはありません。
#include "App.h"
#include
#include
#include
#include "CommandPipe.h"

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

BSoundPlayer *player;
BCommandPipe *cp;
FILE *fp, *dummy;

char buf1[AUDIO_BLOCK_SIZE*512];
char *buf2, *bufend = buf1 + sizeof(buf1);

static void
audioplay_callback(void *cookie, void *buffer, size_t bufferSize, const media_raw_audio_format &format)
{
size_t len, amount, len2;
char *buf = (char *)buffer;

while (bufferSize > 0) {
if(buf2 >= bufend) break;

len = MIN(AUDIO_BLOCK_SIZE, bufferSize);
memcpy(buf, buf2, len);

buf += len;
buf2 += len;
bufferSize -= len;
}
}

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, "auau", audioplay_callback);

player->SetVolume(1.0);
player->Start();
player->SetHasData(true);
}

static void
pipe_open()
{
cp = new BCommandPipe();
cp->AddArg("ffmpeg");
cp->AddArg("-i");
cp->AddArg("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 swfVfy=1");
cp->AddArg("-ac");
cp->AddArg("2");
cp->AddArg("-ar");
cp->AddArg("48000");
cp->AddArg("-f");
cp->AddArg("wav");
cp->AddArg("-");

cp->PipeInto(&fp, &dummy);
fread(buf1, 1, sizeof(buf1), fp);
buf2 = buf1;
}

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

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

int
main(void)
{
App *app = new App();
app->Run();
delete app;
return 0;
}
ffmpeg へのlibrtmp の追加は、残念ながら configure 一発ではできなかったので、また別の機会にでも。

0 件のコメント:

コメントを投稿