package com.example.helppeople;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.webrtc.Camera1Enumerator;
import org.webrtc.EglBase;
import org.webrtc.MediaConstraints;
import org.webrtc.PeerConnectionFactory;
import org.webrtc.SurfaceTextureHelper;
import org.webrtc.SurfaceViewRenderer;
import org.webrtc.VideoCapturer;
import org.webrtc.VideoSource;
import org.webrtc.VideoTrack;
public class StreamingActivity extends AppCompatActivity {
private PeerConnectionFactory peerConnectionFactory;
private VideoCapturer videoCapturer;
private VideoTrack localVideoTrack;
private SurfaceViewRenderer surfaceViewRenderer;
private EglBase eglBase;
private SurfaceTextureHelper surfaceTextureHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_streaming);
surfaceViewRenderer = findViewById(R.id.surface_view);
eglBase = EglBase.create();
surfaceViewRenderer.init(eglBase.getEglBaseContext(), null);
initializeWebRTC();
startStreaming();
}
private void initializeWebRTC() {
PeerConnectionFactory.InitializationOptions initializationOptions =
PeerConnectionFactory.InitializationOptions.builder(this)
.createInitializationOptions();
PeerConnectionFactory.initialize(initializationOptions);
PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
peerConnectionFactory = PeerConnectionFactory.builder()
.setOptions(options)
.createPeerConnectionFactory();
MediaConstraints constraints = new MediaConstraints();
surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBase.getEglBaseContext());
videoCapturer = createCameraCapturer(new Camera1Enumerator(false));
VideoSource videoSource = peerConnectionFactory.createVideoSource(videoCapturer.isScreencast());
videoCapturer.initialize(surfaceTextureHelper, this, videoSource.getCapturerObserver());
localVideoTrack = peerConnectionFactory.createVideoTrack("100", videoSource);
localVideoTrack.addSink(surfaceViewRenderer);
}
private void startStreaming() {
if (videoCapturer != null) {
try {
videoCapturer.startCapture(1280, 720, 30);
Toast.makeText(this, "开始直播...", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "直播启动失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
private VideoCapturer createCameraCapturer(Camera1Enumerator enumerator) {
final String[] deviceNames = enumerator.getDeviceNames();
for (String deviceName : deviceNames) {
if (enumerator.isFrontFacing(deviceName)) {
VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
if (videoCapturer != null) {
return videoCapturer;
}
}
}
return null;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人