Android開源:SopCastComponent-來瘋直播安卓控件

sydk2017 7年前發布 | 24K 次閱讀 直播 Android Android開發 移動開發

歡迎關注來瘋手機安卓直播開源項目,這是一個由純java編寫的項目,但是性能方面依然不錯。整個項目完成了采集、 視音頻處理、編碼、數據發送前處理、數據發送的功能。整個項目支持flv封包,rtmp上傳,當然也向外面提供了封包和上傳的相關接口。 整個項目是我們來瘋安卓團隊的努力結果,但是可能某些地方依然會有一些不足之處,歡迎您提出寶貴的意見和建議。

sopcast

技術文檔

Android手機直播(一)總覽

Android手機直播(二)攝像機

Android手機直播(三)聲音采集

支持功能

  • 硬編碼
  • 弱網絡環境處理
  • 動態碼率調整
  • 攝像頭參數設置
  • 音頻參數設置
  • 視頻參數設置
  • 支持不同窗口尺寸
  • 支持基于Gpu的視頻特處理
  • 支持靜音
  • 支持rtmp上傳
  • 支持水印
  • 支持截屏錄制
  • 支持攝像頭切換
  • 支持flv封包
  • 支持攝像頭自動對焦和手動對焦切換
  • 支持攝像頭縮放
  • 支持閃光燈操作
  • 支持音頻回聲消除

要求

  • 攝像頭相關操作: Android sdk 版本 14+
  • 視頻直播: Android sdk 版本 18+

如何使用

1. 下載

使用起來非常方便, Gradle:

compile 'com.laifeng:sopcast-sdk:1.0.4'

2. 權限

在使用前需要添加相應的權限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.autofocus" />

注意: 在Android 6.0以后很多權限需要動態申請. 如果你想快速使用,可以將項目的targetSdkVersion設置在23一下。

3. 預覽窗口大小

CameraLivingView支持View固定大小(EXACTLY)的模式,當然也可以在xml中定義窗口的長寬比, 這樣的話一個參數要設為固定大小,另外一個參數設為"wrap_content"。 參考代碼如下:

<com.laifeng.sopcastsdk.ui.CameraLivingView
    android:id="@+id/liveView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:aspect_ratio="0.8"/>

4. 攝像頭參數設置

CameraConfiguration.Builder cameraBuilder = new CameraConfiguration.Builder();
cameraBuilder.setOrientation(CameraConfiguration.Orientation.LANDSCAPE)
        .setFacing(CameraConfiguration.Facing.BACK).setPreview(720, 1280)
        .setFps(24).setFocusMode(CameraConfiguration.FocusMode.TOUCH);
CameraConfiguration cameraConfiguration = cameraBuilder.build();
mLFLiveView.setCameraConfiguration(cameraConfiguration);

在Activity的onCreate方法中設置攝像頭參數信息,那么攝像頭就會按照你的設置進行打開。如果你在橫屏界面,需要將攝像頭設置為橫屏模式。 你可以傳入一個攝像頭預覽尺寸的大小,內部會找出和這個設置的大小最匹配的尺寸進行使用。如果攝像頭預覽大小和屏幕顯示大小不一致,則會先澤中間部分進行縮放顯示。 如果你使用默認的設置的話,則不需要進行任何設置。很多手機前置攝像頭需要設置fps為15,否則在弱光下會很黑。

默認設置如下:

public static final int DEFAULT_HEIGHT = 1280;
public static final int DEFAULT_WIDTH = 720;
public static final int DEFAULT_FPS = 15;
public static final Facing DEFAULT_FACING = Facing.FRONT;
public static final Orientation DEFAULT_ORIENTATION = Orientation.PORTRAIT;
public static final FocusMode DEFAULT_FOCUSMODE = FocusMode.AUTO;

5. 視頻參數設置

VideoConfiguration.Builder videoBuilder = new VideoConfiguration.Builder();
videoBuilder.setSize(640, 360).setMime(DEFAULT_MIME)
        .setFps(15).setBps(300, 800).setIfi(2);
mVideoConfiguration = videoBuilder.build();
mLFLiveView.setVideoConfiguration(mVideoConfiguration);

在直播之前可以進行視頻參數設置,可以通過setSize()方法來設置視頻輸出的尺寸大小,如果設置的尺寸比例不符合預覽尺寸比例,則會選擇中間區域進行縮放輸出。 在直播之前可以設置視頻的最大和最小碼率,直播的時候先使用最大碼率,后來根據網絡環境進行調整,但是碼率始終在最大和最小碼率之間。mime參數將會設置到硬編 編碼器,請確保mime的正確性,ifi參數也會傳遞到硬編編碼器。如果你使用默認參數,則不需要進行任何設置。

默認設置如下:

public static final int DEFAULT_HEIGHT = 640;
public static final int DEFAULT_WIDTH = 360;
public static final int DEFAULT_FPS = 15;
public static final int DEFAULT_MAX_BPS = 1300;
public static final int DEFAULT_MIN_BPS = 400;
public static final int DEFAULT_IFI = 2;
public static final String DEFAULT_MIME = "video/avc";

6. 音頻參數設置

AudioConfiguration.Builder audioBuilder = new AudioConfiguration.Builder();
audioBuilder.setAec(true).setBps(32, 64).setFrequency(16000).setMime(DEFAULT_MIME).
        setAacProfile(DEFAULT_AAC_PROFILE).setAdts(DEFAULT_ADTS).
        setChannelCount(1).setEncoding(DEFAULT_AUDIO_ENCODING);
AudioConfiguration audioConfiguration = audioBuilder.build();
mLFLiveView.setAudioConfiguration(audioConfiguration);

通過'setAec(true)'方法可以打開回聲消除功能,回聲消除功能僅僅在(8000, 16000)采樣率并且單聲道下支持。 mime參數將會設置到硬編編碼器,請使用正確的mime參數。如果使用默認參數,則不需要進行任何設置。

默認設置如下:

public static final int DEFAULT_FREQUENCY = 44100;
public static final int DEFAULT_MAX_BPS = 64;
public static final int DEFAULT_MIN_BPS = 32;
public static final int DEFAULT_ADTS = 0;
public static final String DEFAULT_MIME = "audio/mp4a-latm";
public static final int DEFAULT_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
public static final int DEFAULT_AAC_PROFILE = MediaCodecInfo.CodecProfileLevel.AACObjectLC;
public static final int DEFAULT_CHANNEL_COUNT = 1;
public static final boolean DEFAULT_AEC = false;

7. 設置打包器

RtmpPacker packer = new RtmpPacker();
packer.initAudioParams(AudioConfiguration.DEFAULT_FREQUENCY, 16, false);
mLFLiveView.setPacker(packer);

我們內部提供了flv和rtmp的打包器,你也可以定義自己的打包器。打包器負責將硬編后的視音頻進行打包,然后傳遞給發送者進行發送。

8. 設置發送器

String url = "rtmp://[host]:1935/[app]/[stream]";
mRtmpSender = new RtmpSender(url);
mRtmpSender.setVideoParams(640, 360);
mRtmpSender.setAudioParams(AudioConfiguration.DEFAULT_FREQUENCY, 16, false);
mRtmpSender.setSenderListener(mSenderListener);
mLFLiveView.setSender(mRtmpSender);

我們提供了本地和rtmp的發送器,本地發送器就是保持文件到本地,你也可以定義自己的發送器。

9. 視頻特效

我們提供了無特效和灰色兩種特效,你也可以定義符合自己風格的視頻特效。

mLFLiveView.setEffect(mGrayEffect);

10. 水印

在這往視頻上添加水印也非常方便,設置水印后預覽和輸出都會顯示相應尺寸的水印。設置水印的大小和位置是居于輸出視頻的, 預覽界面會根據輸出視頻的情況等比例顯示水印。請設置視頻水印的長寬比和水印圖片的長寬比一致。

Bitmap watermarkImg = BitmapFactory.decodeResource(getResources(), R.mipmap.watermark);
Watermark watermark = new Watermark(watermarkImg, 50, 25, WatermarkPosition.WATERMARK_ORIENTATION_BOTTOM_RIGHT, 8, 8);
mLFLiveView.setWatermark(watermark);

11. CameraListener

設置一個攝像頭監聽器,這樣的話會受到攝像頭的回調。

//設置預覽監聽
mLFLiveView.setCameraOpenListener(new CameraListener() {
    @Override
    public void onOpenSuccess() {
        Toast.makeText(LandscapeActivity.this, "Camera open success", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onOpenFail(int error) {
        Toast.makeText(LandscapeActivity.this, "Camera open fail", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onCameraChange() {
        Toast.makeText(LandscapeActivity.this, "Camera switch", Toast.LENGTH_LONG).show();
    }
});

12. LivingStartListener

設置直播開始的監聽器,這樣的話會收到開播的相關監聽。

mLFLiveView.setLivingStartListener(new CameraLivingView.LivingStartListener() {
    @Override
    public void startError(int error) {
        Toast.makeText(LandscapeActivity.this, "Start fail", Toast.LENGTH_SHORT).show();
        mLFLiveView.stop();
    }

    @Override
    public void startSuccess() {
        Toast.makeText(LandscapeActivity.this, "Start success", Toast.LENGTH_SHORT).show();
    }
});

The errors:

public static final int NO_ERROR = 0;
public static final int VIDEO_TYPE_ERROR = 1;
public static final int AUDIO_TYPE_ERROR = 2;
public static final int VIDEO_CONFIGURATION_ERROR = 3;
public static final int AUDIO_CONFIGURATION_ERROR = 4;
public static final int CAMERA_ERROR = 5;
public static final int AUDIO_ERROR = 6;
public static final int AUDIO_AEC_ERROR = 7;
public static final int SDK_VERSION_ERROR = 8;

License

SopCastComponent is released under the BSD license. See LICENSE for details.

 本文由用戶 sydk2017 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!