太小的ffmpeg解码RTSP缓冲

太小的ffmpeg解码RTSP缓冲

本文介绍了太小的ffmpeg解码RTSP缓冲的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Android解码RTSP有关ffmpeg,我很快就看到像素化时,图像更新快或用高分辨率的:

I'm decoding rtsp on Android with ffmpeg, and I quickly see pixelization when the image updates quickly or with a high resolution:

谷歌搜索后,我发现,这可能是相关的UDP的缓冲区大小。然后我重新编译了ffmpeg的库里面的ffmpeg以下参数/ libavformat流/ udp.c

After googling, I found that it might be correlated to the UDP buffer size. I have then recompiled the ffmpeg library with the following parameters inside ffmpeg/libavformat/udp.c

#define UDP_TX_BUF_SIZE 327680
#define UDP_MAX_PKT_SIZE 655360

这似乎改进,但它仍然开始在某些点失败。任何想法,这缓冲区我应该增加又如何?

It seems to improve but it still starts to fail at some point. Any idea which buffer I should increase and how?

推荐答案

有关我的问题(http://libav-users.943685.n4.nabble.com/UDP-Stream-Read-Pixelation-Macroblock-Corruption-td4655270.html),我试图从已建立由别人多播UDP流的捕捉到。因为我没有足够的能力与源一塌糊涂,我结束了使用libav切换到使用libvlc作为包装和它的工作。完美这是对我工作的总结:

For my problem (http://libav-users.943685.n4.nabble.com/UDP-Stream-Read-Pixelation-Macroblock-Corruption-td4655270.html), I was trying to capture from a multicast UDP stream that had been set-up by someone else. Because I didn't have the ability to mess with the source, I ended up switching from using libav to using libvlc as a wrapper and it worked perfectly. Here is the summary of what worked for me:

stream.h:

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

struct ctx {
   uchar* frame;
};

stream.cpp:

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中:

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);

这篇关于太小的ffmpeg解码RTSP缓冲的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 02:31