Android開源:SopCastComponent-來瘋直播安卓控件
歡迎關注來瘋手機安卓直播開源項目,這是一個由純java編寫的項目,但是性能方面依然不錯。整個項目完成了采集、 視音頻處理、編碼、數據發送前處理、數據發送的功能。整個項目支持flv封包,rtmp上傳,當然也向外面提供了封包和上傳的相關接口。 整個項目是我們來瘋安卓團隊的努力結果,但是可能某些地方依然會有一些不足之處,歡迎您提出寶貴的意見和建議。
技術文檔
支持功能
- 硬編碼
- 弱網絡環境處理
- 動態碼率調整
- 攝像頭參數設置
- 音頻參數設置
- 視頻參數設置
- 支持不同窗口尺寸
- 支持基于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.