我正在尝试使用适用于Android的WebRTC本机代码包(即不使用WebView)在Android应用内部实现3路视频聊天.我使用node.js编写了一个信令服务器,并使用客户端应用程序内的Gottox socket.io java客户端库连接到服务器,交换SDP数据包并建立双向视频聊天连接.
但是现在我遇到的问题不仅仅是三方通话.WebRTC本机代码包附带的AppRTCDemo应用程序仅演示双向呼叫(如果第三方尝试加入房间,则返回"房间已满"消息).
根据这个答案(与Android没有特别关系),我应该通过创建多个PeerConnections来实现,因此每个聊天参与者将连接到其他2个参与者.
但是,当我创建多个PeerConnectionClient(一个包装PeerConection的Java类,它在libjingle_peerconnection_so.so中的本机端实现)时,会从库内部抛出异常,因为它们都试图与访问相机:
E/VideoCapturerAndroid(21170): startCapture failed
E/VideoCapturerAndroid(21170): java.lang.RuntimeException: Fail to connect to camera service
E/VideoCapturerAndroid(21170): at android.hardware.Camera.native_setup(Native Method)
E/VideoCapturerAndroid(21170): at android.hardware.Camera.<init>(Camera.java:548)
E/VideoCapturerAndroid(21170): at android.hardware.Camera.open(Camera.java:389)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid.startCaptureOnCameraThread(VideoCapturerAndroid.java:528)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid.access$11(VideoCapturerAndroid.java:520)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid$6.run(VideoCapturerAndroid.java:514)
E/VideoCapturerAndroid(21170): at android.os.Handler.handleCallback(Handler.java:733)
E/VideoCapturerAndroid(21170): at android.os.Handler.dispatchMessage(Handler.java:95)
E/VideoCapturerAndroid(21170): at android.os.Looper.loop(Looper.java:136)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid$CameraThread.run(VideoCapturerAndroid.java:484)
Run Code Online (Sandbox Code Playgroud)
在尝试建立连接之前初始化本地客户端时会发生这种情况,因此它与node.js,socket.io或任何信令服务器内容无关.
如何让多个PeerConnections共享相机,以便我可以将同一视频发送给多个同行?
我的一个想法是实现某种单独的相机类来取代可以在多个连接之间共享的VideoCapturerAndroid,但我甚至不确定它是否会起作用,我想知道是否有办法做3-在我开始在库内进行黑客攻击之前使用API进行调用.
是否可能,如果可能,怎么样?
更新:
我尝试在多个PeerConnectionClients之间共享一个VideoCapturerAndroid对象,仅为第一个连接创建它,并将其传递给后续的初始化函数,但这导致了"Capturer只能被捕获一次!" 从VideoCapturer对象为第二个对等连接创建第二个VideoTrack时出现异常:
E/AndroidRuntime(18956): FATAL EXCEPTION: Thread-1397
E/AndroidRuntime(18956): java.lang.RuntimeException: Capturer can only be taken once!
E/AndroidRuntime(18956): at org.webrtc.VideoCapturer.takeNativeVideoCapturer(VideoCapturer.java:52) …
Run Code Online (Sandbox Code Playgroud) 这里是n00b(第一个Android项目).我收到了一个与Android固件版本集成的自定义视频编解码器.它是一个.so文件,包含一个继承自MediaPlayerInterface的类,以及一个自定义MediaPlayerService实现,用于从相应文件类型的create()工厂函数返回自定义编解码器类的实例.
我想用这个编解码器,可以在不包含固件的编解码器,通过将.so文件在我的库/ armeabi文件夹,并通过JNI调用它的手机安装一个视频播放器应用程序的一部分.
从这个问题的答案我得知,在MediaPlayer框架内无法做到这一点,我必须从头开始创建一个新的媒体播放器.首先,我在Java中实现了一个UI,并将其设置为使用自定义视图(而不是VideoView),该视图扩展了SurfaceView并使用MediaPlayer类的实例来播放视频.然后我用自定义媒体播放器Java类替换了这个MediaPlayer实例.我已经设置了JNI接口,模仿android_media_MediaPlayer.cpp的方式,并在JNI代码中调用MediaPlayer C++类.现在我需要用自定义C++媒体播放器类替换它.
这是我开始遇到问题的地方.实施自定义播放器的推荐方法是什么?有吗?除了在源头拖网之外,还有一些关于这些东西的在线文档吗?我可以使用多少框架以及我需要多少重新实现自己?我是否必须实现自己的MediaPlayerService等价物?
任何提示非常感谢.
在我的相机应用程序中,当用户点击屏幕时,我使用以下代码触发自动对焦:
mCamera.autoFocus(null);
Run Code Online (Sandbox Code Playgroud)
我还允许用户在选项屏幕中设置相机闪光模式.问题在于,当触发自动对焦时,相机闪光灯有时会在某些手机上触发,用户会抱怨这一点.在大多数这些手机上,可以通过将闪光模式设置为来避免这种情况Parameters.FLASH_MODE_OFF
.我已经在Galaxy S2上验证了这一点,但在某些手机(例如Nexus 4)上,它仍然会发生(根据用户报告).
触发自动对焦时,如何可靠地防止相机闪光灯开启?可能吗?
我怎样才能得到里面的图像大小AVCaptureVideoPreviewLayer
:
self.cameraPreviewLayer.frame = self.cameraView.frame; // (0.0, 0.0, 320.0, 568.0)
Run Code Online (Sandbox Code Playgroud)
内部的图像AVCaptureVideoPreviewLayer
小于框架。
尝试使用JDK 1.8和eclipse neon构建项目时出现以下错误:
[2016-07-03 02:40:59 - Test1] Dx
PARSE ERROR:
[2016-07-03 02:40:59 - Test1] Dx unsupported class file version 52.0
...while parsing com/example/test1/BuildConfig.class
[2016-07-03 02:40:59 - Test1] Dx
PARSE ERROR:
[2016-07-03 02:40:59 - Test1] Dx unsupported class file version 52.0
...while parsing com/example/test1/MainActivity.class
[2016-07-03 02:40:59 - Test1] Dx
PARSE ERROR:
[2016-07-03 02:40:59 - Test1] Dx unsupported class file version 52.0
...while parsing com/example/test1/R.class
[2016-07-03 02:40:59 - Test1] Dx
PARSE ERROR:
[2016-07-03 02:40:59 - Test1] Dx unsupported class file version 52.0 …
Run Code Online (Sandbox Code Playgroud) 基于Viola和Jones 2001/2004描述的技术,我正在学校开展关于面部检测的项目.
我已经读过OpenCV有这个算法的实现,它的工作非常好.
我想知道你是否有任何关于在测试面部存在之前应用于图像的技术(预处理)的建议(例如直方图均衡)?
我正在尝试EditText
使用提示文本:在英文"password"中..光标正确设置在左侧.但对于提示为"كلمهالمرور"的阿拉伯语,光标始终设置为左侧(提示的结尾)而不是右侧.
<EditText
android:id="@id/ETPass"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/etUsrName"
android:layout_marginLeft="@dimen/_25sdp"
android:layout_marginRight="@dimen/_25sdp"
android:layout_marginTop="@dimen/_5sdp"
android:background="@drawable/signup_edittext_input"
android:ellipsize="start"
android:gravity="center|right"
android:hint="@string/Password"
android:imeOptions="actionNext"
android:inputType="textPassword"
android:paddingRight="@dimen/_5sdp"
android:singleLine="true"
android:textColor="@color/orange"
android:textColorHint="@color/orange" />
Run Code Online (Sandbox Code Playgroud)
这种情况只发生在android:inputType="textPassword"
.对于普通文本,一切正常inputType
.
正如标题所说,我在使用 Camera2 API 在三星 Note5 上录制视频时遇到问题。
我已经从 Camera2Video 示例中修改了我的代码,但不同之处在于我设置了类中的MediaRecorder
using 配置选项,CamcorderProfile
并且在开始视频录制之前进行预览时,我正在捕捉到一个ImageReader
以及将预览渲染到一个SurfaceTexture
(示例不使用ImageReader
)。
这是我的startVideoCapture
功能(几乎与示例相同)
private boolean startVideoCapture() {
if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
debugToast("Can't start video preview");
return false;
}
try {
closePreviewSession();
if(!setUpMediaRecorder())
{
debugToast("setUpMediaRecorder failed");
return false;
}
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<Surface>();
Surface previewSurface = new Surface(texture); …
Run Code Online (Sandbox Code Playgroud) 我创建了一个创建Mandelbrot
集合的程序。现在我正在尝试使其成为多线程。
// mandelbrot.cpp
// compile with: g++ -std=c++11 mandelbrot.cpp -o mandelbrot
// view output with: eog mandelbrot.ppm
#include <fstream>
#include <complex> // if you make use of complex number facilities in C++
#include <iostream>
#include <cstdlib>
#include <thread>
#include <mutex>
#include <vector>
using namespace std;
template <class T> struct RGB { T r, g, b; };
template <class T>
class Matrix {
public:
Matrix(const size_t rows, const size_t cols) : _rows(rows), _cols(cols) {
_matrix = new T*[rows];
for …
Run Code Online (Sandbox Code Playgroud) 我正在进行一个数独谜题,所以我将所有项目都放在一个数组中.
因此,每当我得到一个无效的数字,我必须递归调用一个函数,但我不能这样做.我无法理解id的问题.
我的方法是:
function checkValidity(x,y) {
var number = Math.floor((Math.random()) * 10);
var validnumber = true;
for (i = 0; i < 9; i++) {
if (sudokuValueArray[i][y] == number) {
validnumber = false;
}
}
for (i = 0; i < 9; i++) {
if (sudokuValueArray[x][i] == number) {
validnumber = false;
}
}
if(validnumber==true) {
return number;
}
else if(validnumber == false) {
return checkValidity(x, y);
}
}
Run Code Online (Sandbox Code Playgroud)
第二个功能是:
function CreateSudokeSample() {
for (var x = 0; x < …
Run Code Online (Sandbox Code Playgroud) 我有一个Xamarin Forms应用程序,该应用程序使用SQLite数据库存储用户数据,包括用于通过REST API进行身份验证的登录令牌。
我在Android上遇到一个奇怪的问题,在Visual Studio中通过重新部署应用程序来更新应用程序会导致SQLite数据库中的数据恢复为旧版本(它始终是相同的旧数据)。
我打开SQLiteConnection
里面DependencyService
像这样:
public SQLite.Net.SQLiteConnection GetConnection()
{
var sqliteFilename = "mydatabase.db3";
string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // Documents folder
var path = Path.Combine(documentsPath, sqliteFilename);
var platform = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid();
var conn = new SQLite.Net.SQLiteConnection(platform, path);
// Return the database connection
return conn;
}
Run Code Online (Sandbox Code Playgroud)
登录令牌存储在数据库的一个表中,该表仅包含一行(当前登录的用户)。
从字面上看,打开数据库并读取此令牌是我在App.xaml.cs中要做的第一件事InitializeComponent
。然后,我可以注销并再次登录以刷新令牌,并且该应用程序可以正常运行,并且新数据可以在该应用程序的多次打开和关闭中正确保存。
我的问题是,这个过时的令牌来自哪里?
我试图阻止它出现的一些方法:
System.Environment.SpecialFolder.Personal
文件夹中(与相对应/data/user/0/com.example.myapp/files/mydatabase.db3
),据我所知,这应该擦除数据库。我的应用程序中只有一个地方,我将令牌插入数据库中(当用户登录时),并且我将其记录到控制台中,并且我的应用程序肯定不会将旧令牌重新插入数据库中。我的项目中没有包含此数据的db3文件。无论如何,它将如何到达那里?
此问题仅在最近几周才开始发生,可能是由于更新所致。在此之前,卸载应用程序足以擦除所有数据。
尽管搜索了SQLite和Xamarin文档,但是显然还有一些额外的数据缓存层,尽管我不知道,但是有人可以告诉我它是什么吗?
初始化OpenGL时,我设置了以下内容:
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_FRONT);
Run Code Online (Sandbox Code Playgroud)
然后,我在屏幕上画一个三角形.这就是我所做的一切,真的.但是OpenGL总是使用我指定使用的相反绕组类型glFrontFace
.
三角形顶点定义如下:
static GLfloat TRIANGLE[] = {
0.0f, 0.5f, 0.0f, // Point 1 on image
-0.5f, -0.5f, 0.0f, // Point 2
0.5f, -0.5f, 0.0f, // Point 3
};
Run Code Online (Sandbox Code Playgroud)
您可以在以下图片中看到结果:
我期望的是GL_CCW绘制三角形而CL_CW没有.但结果恰恰相反.
我的观点和观点矩阵都是正确的.什么可能导致这个问题?
android ×7
c++ ×2
video ×2
arabic ×1
avfoundation ×1
c ×1
camera-api ×1
codec ×1
eclipse ×1
eclipse-neon ×1
fractals ×1
frame ×1
hint ×1
ios ×1
java ×1
java-8 ×1
javascript ×1
mandelbrot ×1
media-player ×1
opencv ×1
opengl ×1
sqlite ×1
sudoku ×1
swift ×1
videochat ×1
webrtc ×1