精华内容
下载资源
问答
  • Android推拉测试工具

    2020-09-20 01:34:29
    最近开发拉流直播服务,测试工具一直不太趁手,所以自己开发一个Android推拉测试工具,通过更新地址测试推拉是否正常。携带相关日志。
  • yasea_Android推流

    2018-03-12 18:11:13
    开源yasea视频推流,视频编辑推流方案。可用,已经验证。
  • 推流 android推流和本地mediamuxer合成音视频解决方案(本地采用Camera + AudioRecord实现视频和声音采集,用librtmp库实现推流)
  • Android直播实现(一)Android推流、播放最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后...

    Android直播实现(一)Android端推流、播放

    最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码就可实现编码、推流和取流播放,整理了一下做了一个demo,在这里记录一下

    编码和推流,有两个方案选择:

    一:

    使用javacv来实现,最终也是用过ffmpeg来进行编码和推流,javacv实现到可以直接接收摄像头的帧数据

    需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现PreviewCallback将摄像头每一帧的数据交给javacv即可

    javacv地址:https://github.com/bytedeco/javacv

    demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master

    二:

    使用Android自带的编码工具,可实现硬编码,这里有一个国内大神开源的封装很完善的的库yasea,第一种方法需要实现的Camera采集部分也一起封装好了,进行一些简单配置就可以实现编码推流,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果

    yasea地址(内置demo):https://github.com/begeekmyfriend/yasea

    服务器

    流媒体服务器我用的是srs,项目地址:https://github.com/ossrs/srs

    关于srs的编译、配置、部署、在官方wiki中已经写的很详细了,并且srs同样是国内开发人员开源的项目,有全中文的文档,看起来很方便

    这里有最基本的简单编译部署过程 Android直播实现(二)srs流媒体服务器部署

    播放器

    android端的播放使用vitamio,还是国内的开源播放器,是不是感觉国内的前辈们越来越屌了^~^!

    vitamio支持几乎所有常见的的视频格式和流媒体协议

    vitamio地址(内置demo):https://github.com/yixia/VitamioBundle

    这里使用的是yaesa库,先介绍一下直播实现的流程:

    一:使用yaesa进行摄像头采集、编码然后向srs服务器rtmp推流

    二:部署srs流媒体服务器

    三:使用vitamio取流播放

    yaesa推流:

    首先 clone yesa源码,导入library库

    //布局文件中实现

    //java代码 需要实现接口 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListener

    SrsCameraView cameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera)

    mPublisher = new SrsPublisher(cameraView); //编码状态回调 mPublisher.setEncodeHandler(new SrsEncodeHandler(this)); mPublisher.setRecordHandler(new SrsRecordHandler(this)); //rtmp推流状态回调 mPublisher.setRtmpHandler(new RtmpHandler(this)); //预览分辨率 mPublisher.setPreviewResolution(1280, 720); //推流分辨率 mPublisher.setOutputResolution(720, 1280); //传输率 mPublisher.setVideoHDMode(); //开启美颜(其他滤镜效果在MagicFilterType中查看) mPublisher.switchCameraFilter(MagicFilterType.BEAUTY); //打开摄像头,开始预览(未推流) mPublisher.startCamera(); //mPublisher.switchToSoftEncoder();//选择软编码 mPublisher.switchToHardEncoder();//选择硬编码 //开始推流 rtmpUrl(ip换成服务器的部署ip):"rtmp://192.168.31.126/android/teststream" mPublisher.startPublish(rtmpUrl);

    关键代码就这么几句(状态回调有很多这里就不贴了,可以看demo),剩下的交给yasea,编码推流就搞定了,是不是简单到怀疑人生?

    vitamio取流播放

    首先还是clone vitamio的源码,导入vitamio库 /*首先不要忘了在Manifest里注册InitActivity*/ /*布局文件*/ /*java代码*/ /*onCreate中,用于检查vitamioLibs库是否准备完成 *如果Manifest中没有初始化InitActivity,这里会返回false,并自动初始化InitActivity */ if (!LibsChecker.checkVitamioLibs(this)) return; VideoView mVideoView=(VideoView) findViewById(R.id.surface_view); /*会有几秒延时*/ mVideoView.setVideoPath(rtmpUrl);

    然后就可以开始愉快的播放rtmp流了,是不是简单到令人发指?

    移动端的编码、推流、和播放就到这,后面会介绍一下srs的部署

    展开全文
  • 那么移动端要如何进行推流呢,视频直播提供了Android、IOS推流SDK,用户可以使用对应的SDK进行推流,本文旨在让读者可以按照文章快速的应用Android推流SDK进行推流并且了解常见推流参数的设置。 1)Android Studio...

    场景:使用阿里云直播产品如何进行推流播流,可以参考视频直播快速开始进行创建直播域名推流播流。那么移动端要如何进行推流呢,视频直播提供了Android、IOS推流SDK,用户可以使用对应的SDK进行推流,本文旨在让读者可以按照文章快速的应用Android推流SDK进行推流并且了解常见推流参数的设置。

    1)Android Studio安装,下载Android Studio打开https://developer.android.com/index.html
    1
    2

    2) 安装Android Studio

    3) 下载Android推流sdk 工程:https://help.aliyun.com/document_detail/45270.html?spm=5176.doc50101.6.609.3CsXTp

    4) Android Studio 工程导入:打开AndroidStudio,点击open an existing Andriod studio project,选择文件夹AlivcLiveRecord-v1.2.0-androidAlivcLiveRecord-v1.2.0-androiddemoAlivcLiveRecord,工程导入成功
    3

    5) 基础配置
    1】Android Studio SDK Manager安装Android sdk 平台包
    4
    5
    2】创建Android模拟器
    点击AVD Manger
    6
    选择手机型号
    7
    选择系统镜像
    8

    6) 填入默认推流地址
    res/layout/ demo_activity.xml 中编辑rtmpUrl的地址
    9

    7) 真机运行Android推流sdk (Android推流sdk 不支持模拟器运行)
    1】 Android手机开启开发者选项USB调试模式,不同手机开启方式不同,具体可以百度下;
    10
    2】 电脑安装豌豆荚
    3】 手机USB链接电脑
    4】 运行
    11

    注意:
    Android Sdk 真机运行找不到设备
    1) Android手机是否已经连上机器
    2) Android手机是否开启了开发者选项,USB调试是否打开
    3) Androidstudio是否选择了链接usb 设备
    4) Android studio manager 里面下载的Android sdk平台包是否包含了手机Android版本的包
    5) 手机端是否存在安全软件拦截了USB链接调试
    6) 电脑是否安装豌豆荚

    分辨率、码率、帧率配置
    影响画质的因素:分辨率 码率 帧率

    • 分辨率:直播推流SDK提供多分辨率选择:240P、360P、480P、540P、720P,1080P
    • 码率:编码器每秒编码的数据量,推流器SDK码率单位为kbps
    • 帧率:FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指视频每秒的画面数
      针对视频清晰度和码率分辨率设置提供一份参考,开发者可以通过应用属性来平衡该修改.

    2

    分辨率码率在demo代码中可以修改,用户可以根据自己的需求进行修改,参考如下位置进行修改对应的代码
    1

    展开全文
  • android直播离不开源数据采集,在此就对于视频采集的方法稍作记录1.权限android 开启视频采集需要摄像头权限同事需要声明依赖的外部的硬件或软件,使用摄像头时必须开启设备的摄像头所以需要配置:2.初始化Camera...

    android直播离不开源数据采集,在此就对于视频采集的方法稍作记录

    1.权限

    android 开启视频采集需要摄像头权限

    同事需要声明依赖的外部的硬件或软件,使用摄像头时必须开启设备的摄像头

    所以需要配置:

    2.初始化Camera

    Camera是android获取摄像头源数据的类,使用方式

    a.初始化:

    Camera mCamera = Camera.open();

    打开Camera 的方法有两种方式,一种是无参的Camera.open(),有源码:

    public static Camera open() {

    int numberOfCameras = getNumberOfCameras();

    CameraInfo cameraInfo = new CameraInfo();

    for (int i = 0; i < numberOfCameras; i++) {

    getCameraInfo(i, cameraInfo);

    if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {

    return new Camera(i);

    }

    }

    return null;

    }

    可以看出默认是初始化后置摄像头,如果检测不到后置摄像头,初始化失败

    另一种是传入设想头参数:

    CameraInfo.CAMERA_FACING_BACK //后置摄像头

    CameraInfo.CAMERA_FACING_FRONT//前置摄像头

    b.设置摄像头采集分辨率

    现获取相机参数设置生效类

    Camera.Parameters parameters = mCamera.getParameters();

    设置采集分辨率

    parameters.setPreviewSize(int width, int height)

    这里需要注意,分辨率的宽高不是随便设置的,只能设置此机器支持的分辨率,如何获取此机器的分辨率:

    List sizes = parameters.getSupportedPreviewSizes();

    for(Camera.Size size :sizes){

    int width = size.width;

    int height = size.height;

    }

    c.设置视频采集格式

    android视频采集格式一般为nv21,及yuv420sp,方便转换成可编码的yuv420p格式数据,两者的差别可查看:http://www.jianshu.com/p/7dcaec0b2286

    设置方法:

    parameters.setPreviewFormat(ImageFormat.NV21);

    将设置的相机参数生效:

    mCamera.setParameters(parameters);

    d.旋转查看

    当设置SurfaceHolder查看摄像头图像时会发现采集的摄像头数据是旋转过得

    e40259351f54

    Screenshot_2017-11-02-17-59-38-53.png

    此时想要以采集的角度正确查看需要旋转:

    private static void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera) {

    Camera.CameraInfo info =

    new Camera.CameraInfo();

    Camera.getCameraInfo(cameraId, info);

    int rotation = activity.getWindowManager().getDefaultDisplay()

    .getRotation();

    int degrees = 0;

    switch (rotation) {

    case Surface.ROTATION_0:

    degrees = 0;

    break;

    case Surface.ROTATION_90:

    degrees = 90;

    break;

    case Surface.ROTATION_180:

    degrees = 180;

    break;

    case Surface.ROTATION_270:

    degrees = 270;

    break;

    }

    int result;

    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {

    result = (info.orientation + degrees) % 360;

    result = (360 - result) % 360; // compensate the mirror

    } else { // back-facing

    result = (info.orientation - degrees + 360) % 360;

    }

    camera.setDisplayOrientation(result);

    }

    SurfaceHolder设置方式:

    mCamera.setPreviewDisplay(SurfaceHolder holder)

    e.获取采集数据接口

    mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {

    @Override

    public void onPreviewFrame(byte[] bytes, Camera camera) {

    }

    });

    源数据将通过此接口获取

    f.开启摄像头

    当前面的参数都设置完后,通过此方法开启摄像头:

    mCamera.startPreview();

    e40259351f54

    Screenshot_2017-11-02-18-02-21-79.png

    展开全文
  • 1.主要流程录屏(涉及的Android Api: MediaProjectionManager, MediaProjection,VirtualDisplay可以参考:https://blog.csdn.net/ss182172633/article/details/79480853)编码(通常编为:H264编码,使用api: ...

    1.主要流程

    录屏(涉及的Android Api: MediaProjectionManager, MediaProjection,VirtualDisplay可以参考:https://blog.csdn.net/ss182172633/article/details/79480853)

    编码(通常编为:H264编码,使用api: MediaCodec)

    封包(使用的API:MediaMuxer)

    发送(rtsp)

    2.关于开源项目:ScreenRecorder

    在界面中获取所有可配置的信息EncodeConfig(MediaCodec,MediaMuxer都会使用)

    主要方法:

    获取MediaProjectionManager实例

    mMediaProjectionManager = (MediaProjectionManager) getApplicationContext().getSystemService(MEDIA_PROJECTION_SERVICE);

    录屏授权

    Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();

    startActivityForResult(captureIntent, REQUEST_MEDIA_PROJECTION);

    授权后获取实例

    MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);

    VirtualDisplay virtualDisplay = mediaProjection.createVirtualDisplay("ScreenRecorder-display0",

    config.width, config.height, 1 /*dpi*/,

    DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,

    null /*surface*/, null, null);

    mVirtualDisplay.setSurface(mVideoEncoder.getInputSurface());

    创建封包器并丢数据进出

    mMuxer = new MediaMuxer(mDstPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

    writeSampleData(mVideoTrackIndex, buffer, encodedData);

    通过MediaCodec获取h264数据

    MediaFormat format = createMediaFormat();

    Log.d("Encoder", "Create media format: " + format);

    String mimeType = format.getString(MediaFormat.KEY_MIME);

    final MediaCodec encoder = createEncoder(mimeType);

    try {

    if (this.mCallback != null) {

    // NOTE: MediaCodec maybe crash on some devices due to null callback

    encoder.setCallback(mCodecCallback);

    }

    encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

    onEncoderConfigured(encoder);

    encoder.start();

    } catch (MediaCodec.CodecException e) {

    Log.e("Encoder", "Configure codec failure!\n with format" + format, e);

    throw e;

    }

    MediaCodec 运行状态,编码后的数据通过回掉返回

    /**

    * let media codec run async mode if mCallback != null

    */

    private MediaCodec.Callback mCodecCallback = new MediaCodec.Callback() {

    @Override

    public void onInputBufferAvailable(MediaCodec codec, int index) {

    mCallback.onInputBufferAvailable(BaseEncoder.this, index);

    }

    @Override

    public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {

    mCallback.onOutputBufferAvailable(BaseEncoder.this, index, info);

    }

    @Override

    public void onError(MediaCodec codec, MediaCodec.CodecException e) {

    mCallback.onError(BaseEncoder.this, e);

    }

    @Override

    public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {

    mCallback.onOutputFormatChanged(BaseEncoder.this, format);

    }

    };

    展开全文
  • 音视频实践学习本文目录概述还是先从最简单的搞起来,先从最基本的视频推流开始,要知道在电脑上使用ffmpeg完成推流,简直不要太简单,直接使用ffmpeg的推流命令即可,今天想在android平台实践一下,具体操作大家也...
  • 最简单的基于FFmpeg的移动端例子 Android 推流
  • Q:如何在预览时,等待服务器返回推流地址后,或者其它场景,设置推流地址、码率、帧率、分辨率等参数。 A:目前推流SDK大多数推流参数不支持动态修改,所以修改推流地址需要在非推流状态时进行 // 停止推流(如果...
  • 本发明涉及互联网技术领域,特别涉及一种推流方法、系统及服务器。背景技术:随着互联网的高速发展,众多互联网直播平台和手机直播App兴起,网络直播技术也不断改进。目前流媒体服务器上采用的直播技术主要包括:...
  • Android推流帧率设定

    2019-02-14 11:37:00
    硬件限制部分安卓机器的Camera接口无法实现30FPS及以上的数据采集频率,这个问题在很多机型的前置摄像头上尤为明显。 编码不足我们一般说编码不足是说编码器的计算量太大,机器性能无法胜任,对于Android而言尤为...
  • Real Time Messaging Protocol(RTMP)即实时消息传输协议,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议。 EasyRTMP推流功能特点 - 调用简单 无论是个人...
  • 最简单的基于FFmpeg的移动端例子:Android 推流

    万次阅读 多人点赞 2015-07-25 14:10:50
    本文记录一个安卓平台下基于FFmpeg的视频推流器。该推流器C语言的源代码来自于《最简单的基于FFMPEG的推流器》。相关的概念就不再重复记录了。源代码项目的目录结构如图所示。Java源代码位于src目录,而C代码位于jni...
  • android 推流解决方案

    2016-04-08 11:42:00
    1、LocalSocket + MediaRecorder + librtmp  
  • 编码和推流,有两个方案选择: 一: 使用javacv来实现,最终也是用过ffmpeg来进行编码和推流,javacv实现到可以直接接收摄像头的帧数据 需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现...
  • EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer)、智能丢帧、自动重连、rtmp协议等等多种技术,能够非常有效地适应各种平台(Windows、Linux、ARM、Android、iOS...
  • 为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,大牛直播SDK在送端发布了轻量级RTSP服务SDK。 内置轻量级RTSP服务后,延迟更低,体验更好(内网环境下,200-400毫秒)。 涉及相关库...
  • 直播Android推流外部数据采集

    千次阅读 2016-11-16 18:38:32
    也有客户只是希望拿SDK用来推流,音视频采集部分由自己的代码控制,SDK用来做音视频编码和推流就可以了。 如果是这样,您可以按如下步骤实现: Step1. 设置 setCustomModeType 和相关参数 这里需要...
  • 抖音和直播现在有多火,已经不需要过多说明了,接下来为大家介绍一款黑科技:AirDroidAirDroid是安卓手机必装的应用之一。其中一项功能就是将手机屏幕投屏到电脑上进行手机游戏直播,深受直播界各大主播和游戏爱好者...
  • 音视频流媒体硬解码是指不...EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP推流功能组件,经过多年客户实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linu...
  • 这片博文简单理解下推流端会面对的技术点,名词解释,理解这些点后可以知道推出去的流为什么拉流端观看会卡顿、画质不清晰、色块等问题,当然,出现这些问题也和流媒体服务器分发有关,但我们做要好移动推流端的工作...
  • 部分安卓机器的Camera接口无法实现30FPS及以上的数据采集频率,这个问题在很多机型的前置摄像头上尤为明显。 编码不足 我们一般说编码不足是说编码器的计算量太大,机器性能无法胜任,对于Android而言尤为明显...
  • 通过上面关系的说明,可以大概知道好的画质是分辨率、帧率和码率三者之间的平衡,下面通过一个视频的数据量说明来更直观的感受: 码率如果为10Mb/s,代表1秒钟有10M bit的视频数据,对于YUV422格式的1080P视频而...
  • 代码已经整理好,效果如下图: 地址:https://github.com/geeklx/myapplication2018/tree/master/p004_livedemo

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,912
精华内容 12,764
关键字:

安卓推流