在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译出的库,接下来这张我们使用ffmpeg解码视频文件中的视频帧同时使用SDL去显示。

1、Decodec_Video.c 这是我视频解码的文件,其中内容如下:

#include <stdio.h>
#include <android/log.h>#ifdef __MINGW32__
#undef main /* Prevents SDL from overriding main() */
#endif#include "../SDL/include/SDL.h"
#include "../SDL/include/SDL_thread.h"#include "VideoPlayerDecode.h"
#include "../ffmpeg/libavutil/avutil.h"
#include "../ffmpeg/libavcodec/avcodec.h"
#include "../ffmpeg/libavformat/avformat.h"
#include "../ffmpeg/libswscale/swscale.h"AVFormatContext *pFormatCtx;
int             i, videoStream;
AVCodecContext  *pCodecCtx;
AVCodec         *pCodec;
AVFrame         *pFrame;
AVPacket        packet;
int             frameFinished;
float           aspect_ratio;static struct SwsContext *img_convert_ctx;
SDL_Surface     *screen;
SDL_Overlay *bmp;
SDL_Rect        rect;
SDL_Event       event;JNIEXPORT jint JNICALL Java_com_zhangjie_graduation_videopalyer_jni_VideoPlayerDecode_VideoPlayer
(JNIEnv *env, jclass clz, jstring fileName)
{const char* local_title = (*env)->GetStringUTFChars(env, fileName, NULL);av_register_all();//注册所有支持的文件格式以及编解码器if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());exit(1);}if(avformat_open_input(&pFormatCtx, local_title, NULL, NULL) != 0)return -1;if(avformat_find_stream_info(pFormatCtx, NULL) < 0)return -1;av_dump_format(pFormatCtx, -1, local_title, 0);videoStream=-1;for(i=0; i<pFormatCtx->nb_streams; i++)if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {videoStream=i;break;}if(videoStream==-1)return -1; // Didn't find a video stream// Get a pointer to the codec context for the video streampCodecCtx=pFormatCtx->streams[videoStream]->codec;// Find the decoder for the video streampCodec=avcodec_find_decoder(pCodecCtx->codec_id);if(pCodec==NULL) {fprintf(stderr, "Unsupported codec!\n");return -1; // Codec not found}if(avcodec_open2(pCodecCtx, pCodec, NULL) < 0)return -1;pFrame = avcodec_alloc_frame();if(pFrame == NULL)return -1;// Make a screen to put our video
#ifndef __DARWIN__screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);
#elsescreen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 24, 0);
#endifif(!screen) {fprintf(stderr, "SDL: could not set video mode - exiting\n");exit(1);}// Allocate a place to put our YUV image on that screenbmp = SDL_CreateYUVOverlay(pCodecCtx->width,pCodecCtx->height,SDL_YV12_OVERLAY,screen);img_convert_ctx = sws_getContext(pCodecCtx->width,  pCodecCtx->height, pCodecCtx->pix_fmt,  pCodecCtx->width, pCodecCtx->height,  PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);  // Read frames and save first five frames to diski=0;while(av_read_frame(pFormatCtx, &packet)>=0) {// Is this a packet from the video stream?if(packet.stream_index==videoStream) {avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);// Did we get a video frame?if(frameFinished) {SDL_LockYUVOverlay(bmp);AVPicture *pict;pict->data[0] = bmp->pixels[0];pict->data[1] = bmp->pixels[2];pict->data[2] = bmp->pixels[1];pict->linesize[0] = bmp->pitches[0];pict->linesize[1] = bmp->pitches[2];pict->linesize[2] = bmp->pitches[1];sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pict->data, pict->linesize);SDL_UnlockYUVOverlay(bmp);rect.x = 0;rect.y = 0;rect.w = pCodecCtx->width;rect.h = pCodecCtx->height;SDL_DisplayYUVOverlay(bmp, &rect);}}// Free the packet that was allocated by av_read_frameav_free_packet(&packet);SDL_PollEvent(&event);switch(event.type) {case SDL_QUIT:SDL_Quit();exit(0);break;default:break;}}// Free the YUV frameav_free(pFrame);// Close the codecavcodec_close(pCodecCtx);// Close the video fileav_close_input_file(pFormatCtx);
}

2、编译结果如下:

root@zhangjie:/Graduation/jni# ndk-build
Install        : libSDL.so => libs/armeabi/libSDL.so
Install        : libffmpeg-neon.so => libs/armeabi/libffmpeg-neon.so
Compile arm    : ffmpeg-test-neon <= Decodec_Video.c
/Graduation/jni/jniffmpeg/Decodec_Video.c: In function 'Java_com_zhangjie_graduation_videopalyer_jni_VideoPlayerDecode_VideoPlayer':
/Graduation/jni/jniffmpeg/Decodec_Video.c:106:1: warning: passing argument 2 of 'sws_scale' from incompatible pointer type [enabled by default]
/Graduation/jni/jniffmpeg/../ffmpeg/libswscale/swscale.h:237:5: note: expected 'uint8_t const * const*' but argument is of type 'uint8_t **'
/Graduation/jni/jniffmpeg/Decodec_Video.c:137:2: warning: 'av_close_input_file' is deprecated (declared at /Graduation/jni/jniffmpeg/../ffmpeg/libavformat/avformat.h:1533) [-Wdeprecated-declarations]
SharedLibrary  : libffmpeg-test-neon.so
Install        : libffmpeg-test-neon.so => libs/armeabi/libffmpeg-test-neon.so

3、SDL1.3源码

http://download.csdn.net/detail/jwzhangjie/5596453

4、之前在Android本地视频播放器开发--NDK编译FFmpeg中没有添加swscale功能,所以需要重新编译ffmpeg,其脚本如下:

NDK=/opt/android-ndk-r8d
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
LOCAL_ARM_NEON=true
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -mcpu=cortex-a8"
PREFIX=./android/$CPU
./configure --target-os=linux \--prefix=$PREFIX \--enable-cross-compile \--arch=arm \--enable-nonfree \--enable-asm \--cpu=cortex-a8 \--enable-neon \--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \--nm=$PREBUILT/bin/arm-linux-androideabi-nm \--sysroot=$PLATFORM \--extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 $OPTIMIZE_CFLAGS " \--disable-shared \--enable-static \--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -nostdlib -lc -lm -ldl -llog" \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-encoders \--enable-avformat \--disable-optimizations \--disable-doc \--enable-pthreads \--disable-yasm \--enable-zlib \--enable-pic \--enable-small#make clean
make  -j4 install$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg-neon.so -shared -nostdlib  -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg-neon.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a  libavfilter/libavfilter.a libswresample/libswresample.a libswscale/libswscale.a libavdevice/libavdevice.a -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

Android本地视频播放器开发--视频解码相关推荐

  1. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  2. android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...

    在上一章  Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)[http://www.linuxidc.com/Linux/2013-06/85955p5.htm]中使用Ope ...

  3. Android本地视频播放器开发--NDK编译FFmpeg

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  4. Android本地视频播放器开发--SDL编译

    在上一章 Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)中使用OpenSL ES来播放视频的声音,遗留的问题是声音的不同步,由于视频实现部分也要同步,而且音视频也要同步,所 ...

  5. Android本地视频播放器开发 - 搜索本地视频(1)

    这一章的主要内容是搜索手机本地视频,添加到ListView列表里,每一个表项含有这个视频的缩略图,视频的播放时间,视频的标题,在搜索本地视频(1)中我们先制作搜索功能.   Video.java--视 ...

  6. Android本地视频播放器开发--搜索本地视频(1)

    这一章的主要内容是搜索手机本地视频,添加到ListView列表里,每一个表项含有这个视频的缩略图,视频的播放时间,视频的标题,在搜索本地视频(1)中我们先制作搜索功能. Video.java--视频相 ...

  7. android音视频播放器开发百度云,Android 播放端 SDK

    1 概述 PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单.快捷的接口,帮助开发者在 Android ...

  8. Android本地视频播放器mediaplay版

    本文为自定义的视频播放器,可进行屏幕切换(由于换屏时大小变化,电脑截图就分开截图了),效果如下图: --------------播放视频概括: SurfaceView+MediaPlayer以及 Vi ...

  9. 基于NDK、C++、FFmpeg的android视频播放器开发实战-夏曹俊-专题视频课程

    基于NDK.C++.FFmpeg的android视频播放器开发实战-1796人已学习 课程介绍         课程包含了对流媒体(拉流)的播放,演示了播放rtmp的香港卫视,支持rtsp摄像头和ht ...

最新文章

  1. Ubuntu管理开机自启动程序
  2. Elasticsearch之集群脑裂
  3. Linux服务器通过rz/sz轻松上传下载文件
  4. Cucumber入门之_argument
  5. Python实现softmax函数
  6. swift3.0 post Json解析
  7. java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据
  8. PyTorch中的torch.nn.Parameter() 详解
  9. 即时通讯学习笔记003---Tigase代码框架解读
  10. Python成绩单雷达图
  11. PyTorch入坑(一)~(三): Tensor的概念,基本操作和线性回归
  12. Unity3D脚本中创建的gameobject如何删除
  13. FireFox如何使用扩展
  14. 图像匹配几种常见算法与实践
  15. blender 简单的浮雕制作
  16. excel取消合并单元格并自动填充数据
  17. 2022:OFA: Unifying Architectures, Tasks, and Modalities through A Simple S2s Learning Framework
  18. 微信小程序组件化的解决方案
  19. 其实装修也是工程管理
  20. cacti监控及配置

热门文章

  1. sap采购订单更改记录_SAP标准采购流程
  2. 视觉激光融合——VLOAM / LIMO算法解析
  3. 自己实现spring核心功能 一
  4. input按钮中的onclick事件
  5. 作业09-集合与泛型
  6. mongoose的基本操作
  7. [设计模式]8. C++与中介者模式(mediator pattern)
  8. 101个MySQL的调节和优化的Tips
  9. 自学HTML5第三节(拖放效果)
  10. 【转】BI 入门: 体系架构及相关技术