这个项目是手机的摄像头作为硬件,采集视频流信息,把视频流推流到rtmp服务器,然后在本地使用vlc打开推流的视频,如果可以收到视频流,则证明推流成功
直播
采集端:
音视频采集,视频处理(美颜,水印) 音视频编码压缩 把音视频封装FLV TS
常用框架
AVFoundation:数据
GPUImage:美颜
FFmpeg: 音频压缩
X264: 视频压缩
libremp: 推流
服务器流程:
数据分发CDN 鉴黄 截屏:展示主播画面 录制视频 实时转码
流媒体服务器
常用服务器 SNS BMS nginx
播放端流程
从FLV TS 分离中音视频数据 音视频解码 播放 聊天互动
播放端 观众
ijkplayer :播放
FFmpeg: 视频解码
VideoToolbox:视频硬解码
AudioToolbox:音频硬解码
github上有现成的开源实现,
推流、美颜、水印、弹幕、点赞动画、
滤镜、播放都有。技术其实不是很难,
而且现在很多云厂商都提供SDK,
七牛云、金山云、乐视云、腾讯云、百度云、
斗鱼直播伴侣推流端,功能几乎都是一样的,没啥亮点,
不同的是整个直播平台服务差异和接入的简易性。
后端现在 RTMP/HTTP-FLV 清一色,App挂个源站直接接入云厂商或CDN就OK。
1.先看效果图:
手机多种滤镜的运行效果:
因为代码实在太多,所以贴了一个项目地址,大概30M
项目地址:https://github.com/wrs13634194612/Rtmp-Video-Android.git
贴一下主要的核心代码:
1.清单文件申请权限:打开摄像头,麦克风采集声音信息,
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
2.主界面
package net.ossrs.yasea.demo;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.administrator.testz.R;
import com.github.faucamp.simplertmp.RtmpHandler;
import com.seu.magicfilter.utils.MagicFilterType;
import net.ossrs.yasea.SrsCameraView;
import net.ossrs.yasea.SrsEncodeHandler;
import net.ossrs.yasea.SrsPublisher;
import net.ossrs.yasea.SrsRecordHandler;
import java.io.IOException;
import java.net.SocketException;
import java.util.Random;
public class MainActivity extends AppCompatActivity implements RtmpHandler.RtmpListener,
SrsRecordHandler.SrsRecordListener, SrsEncodeHandler.SrsEncodeListener {
private static final String TAG = "Yasea";
private Button btnPublish;
private Button btnSwitchCamera;
private Button btnRecord;
private Button btnSwitchEncoder;
private Button btnPause;
private SrsCameraView mCameraView;
private SharedPreferences sp;
private String rtmpUrl = "rtmp://ossrs.net/" + getRandomAlphaString(3) + '/' + getRandomAlphaDigitString(5);
private String recPath = Environment.getExternalStorageDirectory().getPath() + "/test.mp4";
private SrsPublisher mPublisher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
// response screen rotation event
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
// restore data.
sp = getSharedPreferences("Yas