VLC1.2 播放视频迟滞卡
用libvlc 提供的示例,用1080p播放本事是720p的视频,会有卡住的现象。
后改用32位播放后正常。(R,G,B的掩码需要适当调换。我在ubuntu上编译两个项目,掩码值都需要调换,不知道为什么)
SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_SRCCOLORKEY | SDL_SRCALPHA, w,h, 32, 0xff0000, 0xff00, 0x00ff, 0);
SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_SRCCOLORKEY | SDL_SRCALPHA, w, h,32, 0x00ff, 0xff00, 0xff0000, 0);
示例代码:
#include <stdio.h> #include <stdint.h> #include <math.h> #include <stdlib.h> #include <assert.h> #include <SDL/SDL.h> #include <SDL/SDL_mutex.h> #include <vlc/vlc.h> #define WIDTH 1920 #define HEIGHT 1080 #define VIDEOWIDTH 1920 #define VIDEOHEIGHT 1080 struct ctx { SDL_Surface *surf; SDL_mutex *mutex; }; static void *lock( void *data, void **p_pixels) { struct ctx *ctx = data; SDL_LockMutex(ctx->mutex); SDL_LockSurface(ctx->surf); *p_pixels = ctx->surf->pixels; return NULL; /* picture identifier, not needed here */ } static void unlock( void *data, void *id, void * const *p_pixels) { struct ctx *ctx = data; /* VLC just rendered the video, but we can also render stuff uint16_t *pixels = *p_pixels; int x, y; for(y = 10; y < 40; y++) for(x = 10; x < 40; x++) if(x < 13 || y < 13 || x > 36 || y > 36) pixels[y * VIDEOWIDTH + x] = 0xffff; else pixels[y * VIDEOWIDTH + x] = 0x0; */ SDL_UnlockSurface(ctx->surf); SDL_UnlockMutex(ctx->mutex); assert (id == NULL); /* picture identifier, not needed here */ } static void display( void *data, void *id) { /* VLC wants to display the video */ ( void ) data; assert (id == NULL); } int vlc_main( int argc, char *argv[]) { libvlc_instance_t *libvlc; libvlc_media_t *m; libvlc_media_player_t *mp; char const *vlc_argv[] = { "--no-audio" , /* skip any audio track */ "--no-xlib" , /* tell VLC to not use Xlib */ }; int vlc_argc = sizeof (vlc_argv) / sizeof (*vlc_argv); SDL_Surface *screen, *empty; SDL_Event event; SDL_Rect rect; int done = 0, action = 0, pause = 0, n = 0; struct ctx ctx; /* if(argc < 2) { printf("Usage: %s <filename>\n", argv[0]); return EXIT_FAILURE; } */ /* * Initialise libSDL */ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTTHREAD) == -1) { printf ( "cannot initialize SDL\n" ); return EXIT_FAILURE; } empty = SDL_CreateRGBSurface(SDL_SWSURFACE, VIDEOWIDTH, VIDEOHEIGHT, 32, 0, 0, 0, 0); ctx.surf = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_SRCCOLORKEY|SDL_SRCALPHA, VIDEOWIDTH, VIDEOHEIGHT, 32, 0x00ff, 0xff00, 0xff0000, 0); ctx.mutex = SDL_CreateMutex(); int options = SDL_ANYFORMAT | SDL_HWSURFACE | SDL_DOUBLEBUF; screen = SDL_SetVideoMode(WIDTH, HEIGHT, 0, options); if (!screen) { printf ( "cannot set video mode\n" ); return EXIT_FAILURE; } /* * Initialise libVLC */ libvlc = libvlc_new(vlc_argc, vlc_argv); m = libvlc_media_new_path(libvlc, "./test.mp4" ); mp = libvlc_media_player_new_from_media(m); libvlc_media_release(m); libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx); libvlc_video_set_format(mp, "RV32" , VIDEOWIDTH, VIDEOHEIGHT, VIDEOWIDTH*4); libvlc_media_player_play(mp); /* * Main loop */ rect.w = 0; rect.h = 0; while (!done) { action = 0; /* Keys: enter (fullscreen), space (pause), escape (quit) */ while ( SDL_PollEvent( &event ) ) { switch (event.type) { case SDL_QUIT: done = 1; break ; case SDL_KEYDOWN: action = event.key.keysym.sym; break ; } } switch (action) { case SDLK_ESCAPE: done = 1; break ; case SDLK_RETURN: options ^= SDL_FULLSCREEN; screen = SDL_SetVideoMode(WIDTH, HEIGHT, 0, options); break ; case ' ' : pause = !pause; break ; } // rect.x = (int)((1. + .5 * sin(0.03 * n)) * (WIDTH - VIDEOWIDTH) / 2); // rect.y = (int)((1. + .5 * cos(0.03 * n)) * (HEIGHT - VIDEOHEIGHT) / 2); rect.x=0; rect.y=0; if (!pause) n++; /* Blitting the surface does not prevent it from being locked and * written to by another thread, so we use this additional mutex. */ SDL_LockMutex(ctx.mutex); SDL_BlitSurface(ctx.surf, NULL, screen, &rect); SDL_UnlockMutex(ctx.mutex); SDL_Flip(screen); SDL_Delay(0); SDL_BlitSurface(empty, NULL, screen, &rect); } /* * Stop stream and clean up libVLC */ libvlc_media_player_stop(mp); libvlc_media_player_release(mp); libvlc_release(libvlc); /* * Close window and clean up libSDL */ SDL_DestroyMutex(ctx.mutex); SDL_FreeSurface(ctx.surf); SDL_FreeSurface(empty); SDL_Quit(); return 0; } |
标签:
VLC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?