5

ffmpeg を使用して Android で rtsp をデコードしています。画像がすばやく更新されるか、高解像度で更新されると、ピクセル化がすぐにわかります。

ワーキングデコードフレーム

動作していないデコードされたフレーム

グーグルで調べたところ、UDP バッファ サイズと相関している可能性があることがわかりました。次に、ffmpeg/libavformat/udp.c 内の次のパラメーターを使用して ffmpeg ライブラリを再コンパイルしました。

#define UDP_TX_BUF_SIZE 327680
#define UDP_MAX_PKT_SIZE 655360

改善しているように見えますが、まだある時点で失敗し始めています。どのバッファをどのように増やすべきか考えていますか?

4

1 に答える 1

1

私の問題(http://libav-users.943685.n4.nabble.com/UDP-Stream-Read-Pixelation-Macroblock-Corruption-td4655270.html)では、以前のマルチキャストUDPストリームからキャプチャしようとしていました。他の誰かによる設定。ソースをいじる能力がなかったので、libavの使用からラッパーとしてのlibvlcの使用に切り替えることになり、完全に機能しました。これが私のために働いたものの要約です:

stream.h:

#include <vlc/vlc.h>
#include <vlc/libvlc.h>

struct ctx {
   uchar* frame;
};

stream.cpp:

void* lock(void* data, void** p_pixels){
  struct ctx* ctx = (struct ctx*)data;
  *p_pixels = ctx->frame;
  return NULL;
}

void unlock(void* data, void* id, void* const* p_pixels){
  struct ctx* ctx = (struct ctx*)data;
  uchar* pixels = (uchar*)*p_pixels;
  assert(id == NULL);
}

main.cpp:

struct ctx* context = (struct ctx*)malloc(sizeof(*context));
const char* const vlc_args[] = {"-vvv",
                                 "-q",
                                 "--no-audio"};
libvlc_media_t* media = NULL;
libvlc_media_player_t* media_player = NULL;
libvlc_instance_t* instance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);

media = libvlc_media_new_location(instance, "udp://@123.123.123.123:1000");
media_player = libvlc_media_player_new(instance);
libvlc_media_player_set_media(media_player, media);
libvlc_media_release(media);
context->frame = new uchar[height * width * 3];
libvlc_video_set_callbacks(media_player, lock, unlock, NULL, context);
libvlc_video_set_format(media_player, "RV24", VIDEOWIDTH, VIDEOHEIGHT, VIDEOWIDTH * 3);
libvlc_media_player_play(media_player);
于 2013-01-30T14:17:49.873 に答える