2016-03-03 08:32:52 haiyangzhisheng 阅读数 4103
  • C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流

    C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程基于ffmpeg,qt5,opencv进行实战教学。 基于c++编程,掌握录制视频(rtsp和系统相机)录制音频(qt)开发方法,掌握音视频各类参数含义,掌握音视频编码(h264+acc),磨皮美颜(opencv),音视频封装(flv),基于rtmp协议推流。多线程处理技术。掌握nginx-rtmp和crtmpserver的直播服务器配置。

    15339 人正在学习 去看看 夏曹俊

做项目时遇到客户一个另类需求——“拍照必须使用系统相机”,当手机装有第三方相机时,

调用new Intent(MediaStore.ACTION_IMAGE_CAPTURE);会弹出相机选择界面,

但是客户是不允许用户用第三方相机的,因为第三方相机有的可以直接进行选择照片操作,

但是客户要求照片必须是当前拍摄的。

上面是遇到的问题,寻找解决方案,发现Intent可以通过setPackage设置包名来指定

要打开的应用,安卓原生系统中照相机的包名是com.android.camera,通过测试在三

星等几个使用原生系统的手机中可以避免选择第三方相机直接调用了系统相机,但是在

魅族、小米等手机中仍然弹出相机选择界面,通过查看这几款手机自带相机的apk发现,

它们的包名并不是com.android.camera,试着将包名改为魅族小米的包名测试通过,

可以直接指定系统相机;

  虽然找到了原因,但是我们总不能每款手机都做一个适配来指定包名吧。还好安卓

允许我们获取手机中安装的所有apk的信息。我的解决方案是遍历手机中所有安装的软件,

判断软件的名称为"相机,照相机,照相,拍照,摄像,Camera,camera"等关键字,

系统相机无非都是这样命名的。以下是代码:

	/**
	 * 照相功能
	 * imgPath指定照片存储路径
	 */
	public void cameraMethod(Activity activity, int RESULT_CAPTURE_IMAGE,
			String imgPath) {
		try {
			Intent imageCaptureIntent = new Intent(
					MediaStore.ACTION_IMAGE_CAPTURE);
			File out = new File(imgPath);
			Uri uri = Uri.fromFile(out);
			try {// 尽可能调用系统相机
				String cameraPackageName = getCameraPhoneAppInfos(myActivity);
				if (cameraPackageName == null) {
					cameraPackageName = "com.android.camera";
				}
				final Intent intent_camera = activity.getPackageManager()
						.getLaunchIntentForPackage(cameraPackageName);
				if (intent_camera != null) {
					imageCaptureIntent.setPackage(cameraPackageName);
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
			imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
			activity.startActivityForResult(imageCaptureIntent,
					RESULT_CAPTURE_IMAGE);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 对使用系统拍照的处理

	public String getCameraPhoneAppInfos(Activity context) {
		try {
			String strCamera = "";
			List<PackageInfo> packages = context.getPackageManager()
					.getInstalledPackages(0);
			for (int i = 0; i < packages.size(); i++) {
				try {
					PackageInfo packageInfo = packages.get(i);
					String strLabel = packageInfo.applicationInfo.loadLabel(
							context.getPackageManager()).toString();
					// 一般手机系统中拍照软件的名字
					if ("相机,照相机,照相,拍照,摄像,Camera,camera".contains(strLabel)) {
						strCamera = packageInfo.packageName;
						if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
							break;
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (strCamera != null) {
				return strCamera;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

2019-06-04 18:00:00 agora_cloud 阅读数 342
  • C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流

    C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程基于ffmpeg,qt5,opencv进行实战教学。 基于c++编程,掌握录制视频(rtsp和系统相机)录制音频(qt)开发方法,掌握音视频各类参数含义,掌握音视频编码(h264+acc),磨皮美颜(opencv),音视频封装(flv),基于rtmp协议推流。多线程处理技术。掌握nginx-rtmp和crtmpserver的直播服务器配置。

    15339 人正在学习 去看看 夏曹俊

作者:声网Agora 资深软件开发工程师 戚敏明

如今越来越多的用户开始对美颜/道具这一功能产生越来越大的需求,尤其是在泛娱乐场景下。而现如今市场上有许多第三方的美颜 SDK 可以供开发者选择使用,那么这些第三方的美颜 SDK 是否可以与 Agora RTC SDK 进行结合从而实现实时视频泛娱乐这一应用场景呢?答案当然是肯定的。

本文的目的就是要帮助大家快速了解如何使用。默认情况下,Agora RTC SDK 提供端到端的整体方案,Agora RTC SDK 负责采集音视频,前处理,然后将数据发送到对端进行渲染,这种运行模式通常能满足大多数开发者的需求。但如果开发者希望对采集到的数据进行二次处理(比如美颜等),建议通过 setVideoSource(IVideoSourcevideoSource) 调用自定义视频数据源来实现。在这种情况下,整个过程的数据流如下图所示:

1. 从相机采集视频数据

2. 将采集到的数据传递给 FaceUnity SDK 进行二次处理,并进行渲染

3. 将处理过的数据传递给 Agora RTC SDK

4. Agora RTC SDK 将处理过的数据编码通过 SD-RTN 传输到对端,对端进行解码并渲染

640?wx_fmt=png

本文将以 Android 平台代码 为例子来具体讲解如何实现。

1. 设置 Agora RTC SDK 视频源为自定义视频源

// 一个通用的实现 IVideoSource 接口的类如下,本示例程序中未用到该类	
public class MyVideoSource implements IVideoSource {	
    @Override	
    public int getBufferType() {	
        // 返回当前帧数据缓冲区的类型,每种类型数据在 Agora RTC SDK 内部会经过不同的处理,所以必须与帧数据的类型保持一致	
        // 有三种类型 BufferType.BYTE_ARRAY/BufferType.TEXTURE/BufferType.BYTE_BUFFER	
        return BufferType.BYTE_ARRAY;	
    }	
    @Override	
    public boolean onInitialize(IVideoFrameConsumer consumer) {	
        // IVideoFrameConsumer 是由 Agora RTC SDK 创建的,在 MyVideoSource 生命周期中注意保存它的引用,因为后续将通过它将数据传送给SDK	
        mConsumer = consumer;	
    }	
    @Override	
    public boolean onStart() {	
        mHasStarted = true;	
    }	
    @Override	
    public void onStop() {	
        mHasStarted = false;	
    }	
    @Override	
    public void onDispose() {	
        // 释放对 Consumer 的引用	
        mConsumer = null;	
    }	
}

在本示例程序中,使用了 TextureSource 类,该类是 Agora RTC SDK 提供的适用于纹理类型(texture)视频源的预定义实现。当实例化了该类后,可调用 setVideoSource 接口来设置视频源,具体用法如下:

  1. mRtcEngine.setVideoSource(mTextureSource);

2. 采集数据

本示例程序中,使用到的自定义视频源为相机,视频数据采集在示例程序中完成,具体做法如下:

  1. private void openCamera(final int cameraType) {

  2. synchronized (mCameraLock) {

  3. Camera.CameraInfo info = new Camera.CameraInfo();

  4. ......

  5. ...... // 省略部分代码

  6. mCameraOrientation = CameraUtils.getCameraOrientation(cameraId);

  7. CameraUtils.setCameraDisplayOrientation(mActivity, cameraId, mCamera); // 根据相机传感器方向和手机当前方向设置相机预览方向


  8. Camera.Parameters parameters = mCamera.getParameters();


  9. CameraUtils.setFocusModes(parameters);

  10. int[] size = CameraUtils.choosePreviewSize(parameters, mCameraWidth, mCameraHeight); // 选择最佳预览尺寸

  11. ......

  12. ...... // 省略部分代码


  13. mCamera.setParameters(parameters);

  14. }


  15. cameraStartPreview();

  16. }


  17. private void cameraStartPreview() {

  18. ......

  19. ...... // 省略部分代码

  20. mCamera.setPreviewTexture(mSurfaceTexture = new SurfaceTexture(mCameraTextureId));

  21. mCamera.startPreview();

  22. }

其中 openCamera 方法主要是对相机做了一些参数配置,例如预览尺寸,显示方向,对焦模式等,而 cameraStartPreview 方法则主要调用了 setPreviewTexture 方法来指定相机预览数据所需要输出到的 SurfaceTexture。另外本示例程序中还重载了 onPreviewFrame 回调接口,该接口主要用来接收相机返回的预览数据,其中入参 byte[]data 就是相机所捕捉到的预览数据,当得到该数据后本例会调用 mGLSurfaceView.requesetRender() 方法来请求绘制图像。

  1. @Override

  2. public void onPreviewFrame(byte[] data, Camera camera) {

  3. mCameraNV21Byte = data;

  4. mCamera.addCallbackBuffer(data);

  5. mGLSurfaceView.requestRender();

  6. }

如此一来,相机的预览数据就保存在了 mCameraNV21Byte 数组和 mSurfaceTexture 中。

3. 初始化 FaceUnity SDK

在使用 FaceUnity 提供的 SDK 之前,必须进行初始化工作,具体做法如下:

  1. public static void initFURenderer(Context context) {

  2. try {

  3. Log.e(TAG, "fu sdk version " + faceunity.fuGetVersion());


  4. /**

  5. * fuSetup faceunity 初始化

  6. * 其中 v3.bundle:人脸识别数据文件,缺少该文件会导致系统初始化失败;

  7. * authpack:用于鉴权证书内存数组。若没有,请咨询 support@faceunity.com

  8. * 首先调用完成后再调用其他FU API

  9. */

  10. InputStream v3 = context.getAssets().open(BUNDLE_v3);

  11. byte[] v3Data = new byte[v3.available()];

  12. v3.read(v3Data);

  13. v3.close();

  14. faceunity.fuSetup(v3Data, null, authpack.A());


  15. /**

  16. * 加载优化表情跟踪功能所需要加载的动画数据文件 anim_model.bundle;

  17. * 启用该功能可以使表情系数及 avatar 驱动表情更加自然,减少异常表情、模型缺陷的出现。该功能对性能的影响较小。

  18. * 启用该功能时,通过 fuLoadAnimModel 加载动画模型数据,加载成功即可启动。该功能会影响通过 fuGetFaceInfo 获取的 expression 表情系数,以及通过表情驱动的 avatar 模型。

  19. * 适用于使用 Animoji 和 avatar 功能的用户,如果不是,可不加载

  20. */

  21. InputStream animModel = context.getAssets().open(BUNDLE_anim_model);

  22. byte[] animModelData = new byte[animModel.available()];

  23. animModel.read(animModelData);

  24. animModel.close();

  25. faceunity.fuLoadAnimModel(animModelData);


  26. /**

  27. * 加载高精度模式的三维张量数据文件 ardata_ex.bundle。

  28. * 适用于换脸功能,如果没用该功能可不加载;如果使用了换脸功能,必须加载,否则会报错

  29. */

  30. InputStream ar = context.getAssets().open(BUNDLE_ardata_ex);

  31. byte[] arDate = new byte[ar.available()];

  32. ar.read(arDate);

  33. ar.close();

  34. faceunity.fuLoadExtendedARData(arDate);

  35. } catch (Exception e) {

  36. e.printStackTrace();

  37. }

  38. }

4. 对采集到的原始数据进行美颜处理

在第 2 步中,我们已经得到了相机的原始数据,那么下面我们就要调用相应的美颜 API 来对该数据进行二次处理,具体做法如下:

  1. @Override

  2. public void onDrawFrame(GL10 gl) {

  3. try {

  4. mSurfaceTexture.updateTexImage(); // 强制刷新生成新的纹理图片

  5. mSurfaceTexture.getTransformMatrix(mtx);

  6. } catch (Exception e) {

  7. return;

  8. }


  9. if (mCameraNV21Byte == null) {

  10. mFullFrameRectTexture2D.drawFrame(mFuTextureId, mtx, mvp);

  11. return;

  12. }

  13. mFuTextureId = mOnCameraRendererStatusListener.onDrawFrame(mCameraNV21Byte, mCameraTextureId, mCameraWidth, mCameraHeight, mtx, mSurfaceTexture.getTimestamp());

  14. // 用于屏蔽切换调用 SDK 处理数据方法导致的绿屏(切换SDK处理数据方法是用于展示,实际使用中无需切换,故无需调用做这个判断,直接使用 else 分支绘制即可)

  15. if (mFuTextureId <= 0) {

  16. mTextureOES.drawFrame(mCameraTextureId, mtx, mvp);

  17. } else {

  18. mFullFrameRectTexture2D.drawFrame(mFuTextureId, mtx, mvp); // 做显示绘制到界面上

  19. }


  20. mFPSUtil.limit();

  21. mGLSurfaceView.requestRender();


  22. isDraw = true;

  23. }

此处的 onDrawFrame 方法调用由第 2 步中 mGLSurfaceView.requesetRender() 调用触发,其中的 mCameraNV21BytemCameraTextureId 就是我们得到的相机原始数据,在 onDrawFrame 中我们进行了 mOnCameraRendererStatusListener.onDrawFrame 的回调,而该回调接口的实现如下:

  1. @Override

  2. public int onDrawFrame(byte[] cameraNV21Byte, int cameraTextureId, int cameraWidth, int cameraHeight, float[] mtx, long timeStamp) {

  3. int fuTextureId;

  4. byte[] backImage = new byte[cameraNV21Byte.length];

  5. fuTextureId = mFURenderer.onDrawFrame(cameraNV21Byte, cameraTextureId,

  6. cameraWidth, cameraHeight, backImage, cameraWidth, cameraHeight); // FU 美颜操作

  7. if (mVideoFrameConsumerReady) {

  8. mIVideoFrameConsumer.consumeByteArrayFrame(backImage,

  9. MediaIO.PixelFormat.NV21.intValue(), cameraWidth,

  10. cameraHeight, mCameraOrientation, System.currentTimeMillis()); // 数据传递给 Agora RTC SDK

  11. }

  12. return fuTextureId;

  13. }

可以看到,该回调接口又调用了 mFURenderer.onDrawFrame 方法,而该方法中主要调用了如下 FaceUnity 的 API 来对原始数据做美颜处理:

  1. int fuTex = faceunity.fuDualInputToTexture(img, tex, flags, w, h, mFrameId++, mItemsArray, readBackW, readBackH, readBackImg);

其中 imgtex 是我们传入的原始数据, mItemsArray 则是需要用到的美颜效果数组,当该方法返回时,得到的数据便是经过美颜处理的数据,该数据会写回到我们传入的 img 数组中,而返回的 fuTex 则是经过美颜处理的新的纹理标识。而相应的美颜效果可以通过如下方法进行调节(均在 faceunity 当中):

  1. // filter_level 滤镜强度 范围 0~1 SDK 默认为 1

  2. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "filter_level", mFilterLevel);

  3. // filter_name 滤镜

  4. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "filter_name", mFilterName.filterName());


  5. // skin_detect 精准美肤 0:关闭 1:开启 SDK 默认为 0

  6. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "skin_detect", mSkinDetect);

  7. // heavy_blur 美肤类型 0:清晰美肤 1:朦胧美肤 SDK 默认为 0

  8. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "heavy_blur", mHeavyBlur);

  9. // blur_level 磨皮 范围 0~6 SDK 默认为 6

  10. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "blur_level", 6 * mBlurLevel);

  11. // blur_blend_ratio 磨皮结果和原图融合率 范围 0~1 SDK 默认为 1

  12. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "blur_blend_ratio", 1);


  13. // color_level 美白 范围 0~1 SDK 默认为 1

  14. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "color_level", mColorLevel);

  15. // red_level 红润 范围 0~1 SDK 默认为 1

  16. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "red_level", mRedLevel);

  17. // eye_bright 亮眼 范围 0~1 SDK 默认为 0

  18. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "eye_bright", mEyeBright);

  19. // tooth_whiten 美牙 范围 0~1 SDK 默认为 0

  20. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "tooth_whiten", mToothWhiten);

  21. // face_shape_level 美型程度 范围 0~1 SDK 默认为 1

  22. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "face_shape_level", mFaceShapeLevel);

  23. // face_shape 脸型 0:女神 1:网红 2:自然 3:默认 4:自定义(新版美型) SDK 默认为 3

  24. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "face_shape", mFaceShape);

  25. // eye_enlarging 大眼 范围 0~1 SDK 默认为 0

  26. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "eye_enlarging", mEyeEnlarging);

  27. // cheek_thinning 瘦脸 范围 0~1 SDK 默认为 0

  28. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "cheek_thinning", mCheekThinning);

  29. // intensity_chin 下巴 范围 0~1 SDK 默认为 0.5 大于 0.5 变大,小于 0.5 变小

  30. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "intensity_chin", mIntensityChin);

  31. // intensity_forehead 额头 范围 0~1 SDK 默认为 0.5 大于 0.5 变大,小于 0.5 变小

  32. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "intensity_forehead", mIntensityForehead);

  33. // intensity_nose 鼻子 范围 0~1 SDK 默认为 0

  34. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "intensity_nose", mIntensityNose);

  35. // intensity_mouth 嘴型 范围 0~1 SDK 默认为 0.5 大于 0.5 变大,小于 0.5 变小

  36. faceunity.fuItemSetParam(mItemsArray[ITEM_ARRAYS_FACE_BEAUTY_INDEX], "intensity_mouth", mIntensityMouth);

5. 本地对经过美颜处理的数据进行渲染显示

如果本地需要对美颜效果进行预览,则可以对进行过美颜处理的数据进行自渲染,具体做法如下:

  1. mFullFrameRectTexture2D.drawFrame(mFuTextureId, mtx, mvp);

其中 mFuTextureId 便是第 4 步中经过美颜处理返回的新的纹理标识,我们通过调用 mFullFrameRectTexture2D.drawFrame 方法在本地 GLSurfaceView.Renderer 中的 onDrawFrame 方法中进行绘制。

6. 将经过美颜处理的数据发送给对端

当拿到已经经过美颜处理的数据后,下一步要做的就是通过调用 Agora RTC SDK 提供的接口将该数据传送给对端,具体做法如下:

  1. mIVideoFrameConsumer.consumeByteArrayFrame(backImage,

  2. MediaIO.PixelFormat.NV21.intValue(), cameraWidth,

  3. cameraHeight, mCameraOrientation,

  4. System.currentTimeMillis());

其中 mIVideoFrameConsume 就是我们在第 1 步中保存的 IVideoFrameConsumer 对象,通过调用该对象的 consumeByteArrayFrame 方法,我们就可以将经过美颜处理的数据发送给 Agora RTC SDK,然后通过 SD-RTN 传到对端,其中的入参 backImage 便是我们在第 4 步中得到的经过美颜处理的数据, MediaIO.PixelFormat.NV21.intValue() 为该视频数据使用的格式, cameraWidthcameraHeight 为视频图像的宽与高, mCameraOrientation 为视频图像需要旋转的角度, System.currentTimeMillis() 为当前单调递增时间,Agora RTC SDK 以此来判断每一帧数据的先后顺序。

7. 对端对收到的经过美颜处理的数据进行渲染显示

当对端收到发送过来的经过美颜处理的数据时,我们可以对其进行渲染显示(这是默认的渲染方式,当然也可以类似于自定义的视频源去实现自定义渲染,这里就不展开),具体做法如下:

  1. private void setupRemoteView(int uid) {

  2. SurfaceView surfaceV = RtcEngine.CreateRendererView(getApplicationContext());

  3. surfaceV.setZOrderOnTop(true);

  4. surfaceV.setZOrderMediaOverlay(true);

  5. mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceV, VideoCanvas.RENDER_MODE_FIT, uid));

  6. }

其中 uid 为发送端的用户标识。

更多参考:

  • https://docs.agora.io/cn/

  • http://www.faceunity.com/#/developindex

640?wx_fmt=gif


2016-01-22 10:22:20 u010976213 阅读数 4629
  • C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流

    C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程基于ffmpeg,qt5,opencv进行实战教学。 基于c++编程,掌握录制视频(rtsp和系统相机)录制音频(qt)开发方法,掌握音视频各类参数含义,掌握音视频编码(h264+acc),磨皮美颜(opencv),音视频封装(flv),基于rtmp协议推流。多线程处理技术。掌握nginx-rtmp和crtmpserver的直播服务器配置。

    15339 人正在学习 去看看 夏曹俊

第三方SDK接入–Vitamio

说明

由于公司的需求,app需要能播放多种格式的视频,并能实时播放直播的视频流。所以这里使用了一款开放的,功能强大的全能多媒体开发框架—Vitamio。

接下来简单说明下整个Vitamio接入的具体步骤及注意事项。

注:写该文档时使用的Vitamio版本是5.0.0。


所需Vitamio资源

使用第三方SDK必不可少的就是需要多多去官网爬你需要的文档等资源。

Vitamio官网地址:https://www.vitamio.org/

Vitamio集成

首页虽然简介了点,但是很明显,了解到他强大的功能后我们可以直接去下载页面下载我们需要的SDK。

Vitamio集成

红色选中的就是我们所需的文件了。下载后,解压文件,目录大致如下:
VitamioBundle20151118
—– .idea
—–dist
—–vitamio(这个文件夹是我们所需的)
|—–libs(一些so文件)
|—–res
|—–src
|—–(其他的文件)
—–vitamio-sample(示例Demo,可多做参考)
—– 其他的文件


APP集成Vitamio

这里的开发工具我使用的是Android Studio,Eclipse的请参照官方网站上的教程。

1、 将Viamio作为Moduel引入

Android Studio中点击File—New—Import Module:

Vitamio集成

选择我们刚才解压好的文件中的vitamio文件夹,点击OK。

Vitamio集成

此时,估计导入后会有一处错误(没有错误的请无视该步骤),具体错误内容如下:

Vitamio集成

点击Open File 后,错误所在为vitamiobuild.gradle文件:

Vitamio集成

因为我们project中并没有配置这些,所以你可以直接把上面的红框部分修改为同你工程的build.gradle文件中配置的一样即可。比如我这里的修改为:

Vitamio集成

修改完毕后点击Try Again即可导入成功。

2、 将Viamio作为项目依赖

点击File—Project Structure,弹出如下页面:

Vitamio集成

选中你的项目,我这里为app,然后点击Dependencies,点击右上角的绿色“+”号,选择3 Module Dependency:

Vitamio集成

然后选择我们导入的vitamio即可添加完成。

3、 代码中的使用

首先需要注意在配置文件AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

XML代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <io.vov.vitamio.widget.VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然后java类中的使用方式如下:

package com.amailive.helper.amaihelper.videos;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;

import com.amailive.helper.amaihelper.R;
import com.amailive.helper.amaihelper.base.BaseActivty;

import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;

public class VideoActivity extends BaseActivty {

    private VideoView videoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Vitamio.isInitialized(this);//千万别忘了这里的初始化操作
        setContentView(R.layout.activity_video);
        playVideo();
    }

    private void playVideo() {
        videoView = (VideoView) findViewById(R.id.video_view);
        Sring path=”你视频的网址”;
        videoView.setVideoPath(path);
        videoView.setMediaController(new MediaController(this));
        videoView.requestFocus();

        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                //设置快进的倍速
                mediaPlayer.setPlaybackSpeed(1.0f);
                //设置缓冲大小
                mediaPlayer.setBufferSize(512 * 1024);
            }
        });
    }
}

最后根据官方的说法,别忘了修改VideoActivity.java的配置文件:

<activity
      android:name=".videos.VideoActivity"
      android:configChanges=
"orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
      android:process=":vitamio"/>

android:process=”:vitamio” 关闭Activity时直接kill,防止底层库可能存在的BUG导致的崩溃问题。同理也可以通过关闭Activity、重新startActivity来切换剧集。

至此,最最最基本的集成方法已经讲解完毕。接下来项目中需要的时候再对文档进行完善。

2019-11-22 17:51:10 shenggaofei 阅读数 31
  • C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流

    C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程基于ffmpeg,qt5,opencv进行实战教学。 基于c++编程,掌握录制视频(rtsp和系统相机)录制音频(qt)开发方法,掌握音视频各类参数含义,掌握音视频编码(h264+acc),磨皮美颜(opencv),音视频封装(flv),基于rtmp协议推流。多线程处理技术。掌握nginx-rtmp和crtmpserver的直播服务器配置。

    15339 人正在学习 去看看 夏曹俊

   视频通话、视频直播、语音通话、视频录制播放各种处理等功能

1.容联 云通讯

https://www.yuntongxun.com/api/im.html?ly=sem-baidu&qd=pc-dasou&cp=im&xl=null&kw=10918969&bd_vid=9047599401555687554#tab4

https://www.yuntongxun.com/download/download.html

 2.UCloud

https://www.ucloud.cn/site/product/urtc.html?utm_source=baidu&utm_campaign=%E6%B5%B7%E5%A4%96-%E5%9C%BA%E6%99%AF%E8%AF%8D&utm_adgroup=%E5%AE%9E%E6%97%B6%E9%9F%B3%E8%A7%86%E9%A2%91&utm_term=%E8%A7%86%E9%A2%91%E9%80%9A%E8%AF%9Dsdk&utm_medium=search_cpc&utm_channel=pc&utm_content=haiwai-changjingci&ytag=%E8%A7%86%E9%A2%91%E9%80%9A%E8%AF%9Dsdk_%E5%AE%9E%E6%97%B6%E9%9F%B3%E8%A7%86%E9%A2%91RTC_baidu_search

https://www.ucloud.cn/site/opensource/#kyxm

3.网易云信

https://yunxin.163.com/netcall?from=bd2jjX1068

https://yunxin.163.com/live-demo

4.腾讯云

https://cloud.tencent.com/act/pro/trtcnew?fromSource=gwzcw.3018642.3018642.3018642&utm_medium=cpc&utm_id=gwzcw.3018642.3018642.3018642

https://github.com/tencentyun/SuperPlayer_Android

https://cloud.tencent.com/document/product/454/7873#Android

https://cloud.tencent.com/document/product/454/6555

5.环信

https://www.easemob.com/product/im?utm_source=baidu&utm_medium=00.%E5%93%81%E7%89%8C%E8%AF%8D-%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF&utm_campaign=00.%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF%E8%A1%8C%E4%B8%9A%E4%B8%BB%E8%AF%8D&utm_term=%E7%8E%AF%E4%BF%A1%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF%E4%BA%91&e_creative=30128000000&e_keywordid=125606120520&e_keywordid2=125606120520&renqun_youhua=1795911&bd_vid=8395012350620860836

https://www.easemob.com/download/im

6.融云

https://www.rongcloud.cn/active/double11?utm_source=baiduPay&utm_medium=cpc&utm_term=ffmpeg&utm_content=2019%E5%B9%B4%E7%BB%88%E5%A4%A7%E4%BF%83&utm_campaign=PC-%E6%B4%BB%E5%8A%A8%E4%B8%93%E9%A2%98&bd_vid=7787376246920371495

https://github.com/sealtalk/sealtalk-android

https://github.com/rongcloud/sealrtc-android

https://github.com/rongcloud/demo-chatroom/tree/master/client-android/ChatroomDemo

https://github.com/rongcloud/sealmic-android

https://www.rongcloud.cn/docs/open_source.html

7.即构科技

https://market.zego.im/Livevideo_sdk.html

https://doc.zego.im/download/code

https://github.com/zegoim/ZegoChatroom-Android

https://github.com/zegodev/liveroom-topics-android

https://doc.zego.im/download/demo

8.微吼

https://www.vhall.com/store

https://github.com/vhall/vhallsdk_live_android

9.百家云

https://github.com/baijia/BJLiveUI-Android

https://github.com/baijia/BJLiveCore-Android

http://dev.baijiayun.com/wiki/detail/65

10.三体云

http://www.3ttech.cn/index.php?menu=4

http://www.3ttech.cn/index.php?menu=28

11.锐动天地

http://www.rdsdk.com/productsdk.html

12.秀拍客

http://www.56show.com/lepai/lepai.html

13.美摄

https://www.meishesdk.com/

14.七牛云

https://www.qiniu.com/events/20191111?utm_campaign=SEM&utm_content=SEM_baidu&utm_medium=cpc&utm_source=baiduSEM&utm_term=brand

https://github.com/pili-engineering/QNRTC-Android

https://github.com/pili-engineering/PLDroidShortVideo

15.新乐视云联

http://www.lecloud.com/zh-cn/help/api.html

16.阿里云

https://help.aliyun.com/document_detail/45270.html?spm=5176.product29949.6.667.YZNFdd

 

2016-12-15 11:55:10 wangjicong_215 阅读数 968
  • C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流

    C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程基于ffmpeg,qt5,opencv进行实战教学。 基于c++编程,掌握录制视频(rtsp和系统相机)录制音频(qt)开发方法,掌握音视频各类参数含义,掌握音视频编码(h264+acc),磨皮美颜(opencv),音视频封装(flv),基于rtmp协议推流。多线程处理技术。掌握nginx-rtmp和crtmpserver的直播服务器配置。

    15339 人正在学习 去看看 夏曹俊
展讯6.0 平台在添加降噪处理宏控AUDIO_RECORD_NR := true 后,第三方应用美颜相机录像提示美颜mic权限。
此问题和audio_para 参数有关
%audio\EQ_Handsfree\nrArray\nrArray[0]=0x1
%audio\EQ_Handsfree\nrArray\nrArray[1]=0x1111
%audio\EQ_Handsfree\nrArray\nrArray[2]=0x202
%audio\EQ_Handsfree\nrArray\nrArray[3]=0xe890
%audio\EQ_Handsfree\nrArray\nrArray[4]=0xf254
%audio\EQ_Handsfree\nrArray\nrArray[5]=0x0
%audio\EQ_Handsfree\nrArray\nrArray[6]=0x960
%audio\EQ_Handsfree\nrArray\nrArray[7]=0x12c


%audio\EQ_Handsfree\nrArray\nrArray[3]=0xe890//降噪参数 负值可调小
%audio\EQ_Handsfree\nrArray\nrArray[4]=0xf254//降噪参数 负值可调小

%audio\EQ_Handsfree\nrArray\nrArray[6]=0x960//抑制参数,可调小
%audio\EQ_Handsfree\nrArray\nrArray[7]=0x12c//抑制参数,可调小


展讯分析。第三方应用会判断record数据大小。当在安静的环境下,降噪后record数据为0k。会提示没有mic权限。
当在声音环境较大的环境下。record数据不为0k。不会提示没有mic权限的问题。

展讯给的建议:可以根据不同主板,设置降噪参数。



此问题,最终问题应该是美图美颜相机判断mic权限有问题。

没有更多推荐了,返回首页