2024.5.22

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;
}
}
posted @   我也不想的  阅读(2)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示