在Android上使用FFMPEG和SDL 2.X播放视频
2013-10-24 16:51
399 查看
工程:
效果图:
前言:
1.本代码使用的SDL为2.x,意思是使用的SDL_Texture来显示YUV数据
2.大致的过程就是:使用FFMPEG解码出YUV数据,然后使用SDL显示
关键代码:
1.转成YUV
sws_ctx = sws_getContext ( pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, 1536, 1952, PIX_FMT_YUV420P, SWS_BILINEAR, NULL, NULL, NULL );
sws_scale ( sws_ctx, (uint8_t const * const *)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pict.data, pict.linesize );
2.SDL显示YUV数据
a.首先得绑定AVFrame到Buffer
pFrameYUV420p = avcodec_alloc_frame(); uint8_t *buffer; int numBytes; // Determine required buffer size and allocate buffer numBytes=avpicture_get_size(PIX_FMT_YUV420P, 1536, 1952); buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); if(buffer==NULL) { LOGE("buffer is null");return -1; }
还有一句别忘记了
avpicture_fill((AVPicture *)pFrameYUV420p, buffer, PIX_FMT_YUV420P, 1536, 1952);
b.其次得把Buffer数据送到SDL_Texture
int i = SDL_UpdateTexture( pTexture, NULL, buffer, iPitch ); LOGE("after SDL_UpdateTexture"); //SDL_RenderClear( renderer ); //LOGE("after SDL_RenderClear"); SDL_RenderCopy( renderer, pTexture, NULL, NULL ); LOGE("after SDL_RenderCopy"); SDL_RenderPresent( renderer ); LOGE("after SDL_RenderPresent");
事已至此,已经完成了播放,不过非常简陋。
总结:
本文写的很简陋,也存在很多问题:
1.没有加入多线程
2.没有播放速度控制
3.没有音频
4.没有音视频同步
相关文章推荐
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- ffmpeg+SDL的使用之使用SDL播放视频流
- android 使用ffmpeg音视频播放(二)
- Android 音视频深入 六 使用FFmpeg播放视频(附源码下载)
- Android 音视频深入 六 使用FFmpeg播放视频(附源码下载)
- android 使用ffmpeg音视频播放(一)
- Android使用VideoView播放网络视频
- android基于ffmpeg的简单视频播发器 播放视频
- MFC 播放视频 FFMPEG SDL
- Android 使用PLDroidPlayer播放网络视频 依据视频角度自己主动旋转
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——2.1 使用GLSurfaceView和MediaPlayer播放一个平面视频(上)
- Android视频播放项目总结之 使用第三方Vitamio库,开发万能播放器(二)
- Android使用SurfaceView播放视频 简单介绍
- iOS使用ffmpeg播放rstp实时监控视频数据流
- ffmpeg SDL播放视频
- Android-使用ffmpeg添加视频水印过慢问题
- Android使用TextureView播放视频