ffmepg移植到android实现RTSP客户端-问题小记

来源:互联网 发布:淘宝卖化妆品月赚20万 编辑:程序博客网 时间:2024/05/22 14:56

题记:主要是参考这位大神的杰作,在此非常感谢,用到的代码就是这位大神的,请重点看看http://blog.csdn.net/nieyongs/article/details/21407033,我这里主要写一下在调试过程中遇到的问题。

1 andorid.mk文件的编写

    请参照:http://blog.csdn.net/xdonx/article/details/8331011

2 关于surfaceview资料:

    请参照: http://blog.csdn.net/think_soft/article/details/7629345

                             http://www.cnblogs.com/xuling/archive/2011/06/06/android.html 

                   http://www.cnblogs.com/CreateLight/archive/2012/07/04/2575401.html

3 说下videodisplay.java文件中的函数,我的注释比较清楚,对于我等菜鸟而言,注释显得尤为重要。尤其是关于图片实现尺寸变换这个地方。

public class VideoDisplay extends SurfaceView implements SurfaceHolder.Callback {private Bitmap bitmap;private Matrix matrix;private SurfaceHolder sfh;private int width = 0;private int height = 0;private boolean isRun = true;//这只是一个函数的声明,然后在下面函数调用的时候将rtspurl传到jni层去调用public native void initialWithUrl(String url);//主要是对ffmpeg的初始化,后去rtsp数据流的一些参数//public native void initialWithUrl(String url);//获取了图像的尺寸之后在C层代码调用JAVA层代码初始化bitmap对面。因为bitmap初始化需要知道他的尺寸public native void play( Bitmap bitmap);//个就是我们ffmpeg里面的一个循环读取数据解码的过程//ffmpeg数据处理一个线程,surfaceviewy画图一个线程public VideoDisplay(Context context) {super(context);// TODO Auto-generated constructor stubsfh = this.getHolder();sfh.addCallback(this);sfh.addCallback(this);//注册三个回调函数matrix=new Matrix();bitmap = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888);//创建一个位图bitmap并初始化长度、宽度是640*480}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { //arg0 ,1 ,2, 3 这几个参数怎么没用用到呢width = arg2;//新的宽度,这个地方获得的是屏幕的分辨率height = arg3;//新的高度}/* surfaceCreated(SurfaceHolder holder):当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。  surfaceChanged(SurfaceHolder holder, int format, int width,int height):当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。  surfaceDestroyed(SurfaceHolder holder):当Surface被摧毁前会调用该函数,该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源。*/@Override//两个线程:(1)初始化ffmpeg和不断解码视频流;(2)获得的bitmap去刷新界面显示public void surfaceCreated(SurfaceHolder arg0) {Log.i("SUr", "play before");new Thread(new Runnable() {@Overridepublic void run() {Log.i("SUr", "play");initialWithUrl(MainActivity.RTSPURL);play(bitmap);//在FFmpeg里面循环读取解码过程}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (isRun) {if ((bitmap != null)) {//为了避免在画图的时候,UI线程也对surface进行操作,在画图前需要对surface加锁,这个//工作是有holder做。调用lockCanvas。然后进行绘画画完之后,会解锁unlockCanvasAndPostCanvas canvas = sfh.lockCanvas(null);//canvas是一块画布,具体的文本和位图如何显示这就是在paint类中定义的//用canvas对象画图。画图结束后调用holder.unlockCanvasAndPost()就把图画在窗口中了。Paint paint = new Paint();paint.setAntiAlias(true);//给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。//paint.setStyle(Style.FILL);//fill是填充形状,stroke是绘制形状的轮廓paint.setStyle(android.graphics.Paint.Style.FILL);int mWidth = bitmap.getWidth();int mHeight = bitmap.getHeight();//通过矩阵来对bitmap进行尺度变换,目的是填充整个屏幕//matrix提供了setTranslate(),setScale,setRotate分别进行平移、缩放、旋转matrix.reset();//reset()这个方法初始化矩阵matrix.setScale((float) width / mWidth, (float) height/ mHeight); //这个width和height是手机的分辨率,而mWidth和mHeight是要播放的视频的分辨率/*System.out.println("width"+ width);//width得到的是960,这个width是手机的分辨率System.out.println("mwidth"+ mWidth);//mwidth是448 mWidth应该就是要播放视频的分别率:448*336System.out.println("Scale"+ (float)width/mWidth);*/canvas.drawBitmap(bitmap, matrix, paint);sfh.unlockCanvasAndPost(canvas);//解锁}}}}).start();}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {//是销毁线程isRun = false;}public void setBitmapSize(int width, int height) {//这个函数没用用到吗?Log.i("Sur", "setsize");bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);}static {System.loadLibrary("ffmpeg");//一开始没有加载这个System.loadLibrary("ffmpegclient");}}

4 说下碰到的问题

主要是在编译的时候遇到问题,刚开始下载这个工程后,然后直接运行发现时可以的,但是当我想要build发现出现:

也就是找不到ndk-build,然后修改如下:

这个时候,再去build的时候,发现会有警告,不用管它,当时就是在这个警告上搞了半天。
build之后会发现:

这个时候在方框中少了,libffmpeg.so被冲掉了,如果这个时候再复制过来一个libffmpeg.so,然后运行(运行前一定是要先进行build的)仍然会被冲掉。所以play的时候会出现找不到load ffmpeg等错误。正确做法,build后,复制到libs/armeabi文件夹一个libffmpeg.so文件,然后再把第四部分,第二张图改成
去掉ndk-bulid,这个时候再去编译的时候就不会再丢失libffmpeg.so文件,然后运行,正确。
不知道为什么ffmpeg.so被冲掉!求各位看看能否帮助回答。谢谢

0 0
原创粉丝点击