Pjsip Android: 视频通话 - Window 预览大小问题(SurfaceView 用于显示视频帧)
Pjsip Android: Video Call - Window Preview size issue(SurfaceView is used to display video frames)
我正在尝试使用 Pjsip 构建 SIP 呼叫应用程序,到目前为止它运行良好。
我在显示视频时遇到一个问题 window。
我正在使用表面视图来显示流式帧。
请看下图:
我想删除预览两边的黑色 space。
UI 部分:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceIncomingVideo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<SurfaceView
android:id="@+id/surfacePreviewCapture"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_width="@dimen/_100sdp"
android:layout_marginBottom="@dimen/_70sdp"
android:layout_height="@dimen/_130sdp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
app:elevation="0dp">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/layoutCall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/ivBack"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/ivBack">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivHabariLogo"
android:layout_width="27dp"
android:layout_height="37dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/call_ic_habari_logo" />
<android.support.v7.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_8sdp"
android:fontFamily="@font/helvetica_neue_regular"
android:text="@string/toolbar_title_video"
android:textSize="@dimen/_14ssp"
android:textColor="@color/grey"
app:layout_constraintBottom_toBottomOf="@+id/ivHabariLogo"
app:layout_constraintStart_toEndOf="@+id/ivHabariLogo"
app:layout_constraintTop_toTopOf="@+id/ivHabariLogo" />
</android.support.constraint.ConstraintLayout>
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivBack"
android:layout_width="wrap_content"
android:layout_height="?android:attr/actionBarSize"
android:paddingStart="21dp"
android:paddingEnd="5dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/back_arrow_white" />
</android.support.constraint.ConstraintLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/layoutUser"
android:layout_marginTop="@dimen/_24sdp"
android:layout_width="match_parent"
android:layout_height="@dimen/_100sdp" >
<RippleBackground
android:id="@+id/callRinging"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rb_color="@color/ringing_1"
android:layout_gravity="center"
app:rb_duration="2500"
app:rb_radius="@dimen/_40sdp"
app:rb_rippleAmount="3"
app:rb_scale="2">
</RippleBackground>
<RadarViewUsersView
android:id="@+id/radarViewUser"
android:layout_width="@dimen/_100sdp"
android:layout_height="@dimen/_100sdp"
android:layout_gravity="center">
</RadarViewUsersView>
</FrameLayout>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/tvCalleeName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="@dimen/_8sdp"
android:textColor="@color/white"
android:textSize="@dimen/_16ssp"
android:fontFamily="@font/helvetica_neue_regular" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/tvCallState"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:text="@string/sip_call_state_calling"
android:fontFamily="@font/helvetica_neue_regular"
android:layout_marginTop="@dimen/_2sdp"
android:textSize="@dimen/_12ssp" />
</LinearLayout>
</FrameLayout>
<LinearLayout
android:id="@+id/layoutOutgoingCall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:layout_marginBottom="@dimen/_24sdp"
android:visibility="visible"
android:orientation="vertical">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivEndCall"
android:layout_width="wrap_content"
android:layout_weight="0.25"
android:layout_gravity="center"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:layout_height="0dp"
android:padding="@dimen/_16sdp"
app:srcCompat="@drawable/ic_call_reject" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivSwitchCamera"
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_gravity="center"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_switch_camera" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivDisableVideoCall"
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_video_cam_off" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivMuteVoiceCall"
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_video_mic_on" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/layoutIncomingCall"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_marginBottom="@dimen/_16sdp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivRejectCall"
android:layout_width="0dp"
android:layout_weight="0.1"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_call_reject" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivAcceptCall"
android:layout_width="0dp"
android:layout_weight="0.1"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_call_accept" />
</LinearLayout>
</RelativeLayout>
代码部分:
在 onCreate():
surfaceIncomingVideo.holder.addCallback(this)
surfacePreviewCapture.holder.addCallback(previewHandler)
收到预览时:
fun updateVideoPreview(holder: SurfaceHolder) {
if (SipManager.currentCall != null &&
SipManager.currentCall?.mVideoWindow != null &&
SipManager.currentCall?.mVideoPreview != null) {
if (videoPreviewActive) {
val vidWH = VideoWindowHandle()
vidWH.handle?.setWindow(holder.surface)
val vidPrevParam = VideoPreviewOpParam()
vidPrevParam.window = vidWH
try {
SipManager.currentCall?.mVideoPreview?.start(vidPrevParam)
} catch (e: Exception) {
println(e)
}
} else {
try {
SipManager.currentCall?.mVideoPreview?.stop()
} catch (e: Exception) {
println(e)
}
}
}
}
有人可以帮我吗?
提前致谢!
好的,我终于得到了答案。这是因为我设置了旋转相机视图的方向。我认为这是内部 pjsip 问题。
我不会详细介绍如何执行此操作,但总体思路是这样的:
A) 这是 PJSIP 的一个已知/可接受的问题。开发人员已声明其“符合预期”。
B) 解决这个问题需要绕几个圈:
在拨出的电话中添加一个 header,说明您当前的方向。不要,使用 PJSIP 更改它。
让您的 SIP 服务器将此 header 转发到目标客户端。
让目标客户阅读此 header 并在 android 端旋转视频。
我正在处理这个问题,因为我们正在谈论这个问题,并且有方向到达我的观点。我是 android 开发的新手,所以我现在需要弄清楚如何旋转表面视图(setRotation 不起作用...)以及如何在方向改变时向客户端发送额外的请求。
但这就是基本思想......如果你想摆脱酒吧并处理黑酒吧,那就是要走的路。
我正在尝试使用 Pjsip 构建 SIP 呼叫应用程序,到目前为止它运行良好。
我在显示视频时遇到一个问题 window。 我正在使用表面视图来显示流式帧。
请看下图:
我想删除预览两边的黑色 space。
UI 部分:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceIncomingVideo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<SurfaceView
android:id="@+id/surfacePreviewCapture"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_width="@dimen/_100sdp"
android:layout_marginBottom="@dimen/_70sdp"
android:layout_height="@dimen/_130sdp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
app:elevation="0dp">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/layoutCall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/ivBack"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/ivBack">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivHabariLogo"
android:layout_width="27dp"
android:layout_height="37dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/call_ic_habari_logo" />
<android.support.v7.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_8sdp"
android:fontFamily="@font/helvetica_neue_regular"
android:text="@string/toolbar_title_video"
android:textSize="@dimen/_14ssp"
android:textColor="@color/grey"
app:layout_constraintBottom_toBottomOf="@+id/ivHabariLogo"
app:layout_constraintStart_toEndOf="@+id/ivHabariLogo"
app:layout_constraintTop_toTopOf="@+id/ivHabariLogo" />
</android.support.constraint.ConstraintLayout>
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivBack"
android:layout_width="wrap_content"
android:layout_height="?android:attr/actionBarSize"
android:paddingStart="21dp"
android:paddingEnd="5dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/back_arrow_white" />
</android.support.constraint.ConstraintLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/layoutUser"
android:layout_marginTop="@dimen/_24sdp"
android:layout_width="match_parent"
android:layout_height="@dimen/_100sdp" >
<RippleBackground
android:id="@+id/callRinging"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rb_color="@color/ringing_1"
android:layout_gravity="center"
app:rb_duration="2500"
app:rb_radius="@dimen/_40sdp"
app:rb_rippleAmount="3"
app:rb_scale="2">
</RippleBackground>
<RadarViewUsersView
android:id="@+id/radarViewUser"
android:layout_width="@dimen/_100sdp"
android:layout_height="@dimen/_100sdp"
android:layout_gravity="center">
</RadarViewUsersView>
</FrameLayout>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/tvCalleeName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="@dimen/_8sdp"
android:textColor="@color/white"
android:textSize="@dimen/_16ssp"
android:fontFamily="@font/helvetica_neue_regular" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/tvCallState"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:text="@string/sip_call_state_calling"
android:fontFamily="@font/helvetica_neue_regular"
android:layout_marginTop="@dimen/_2sdp"
android:textSize="@dimen/_12ssp" />
</LinearLayout>
</FrameLayout>
<LinearLayout
android:id="@+id/layoutOutgoingCall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:layout_marginBottom="@dimen/_24sdp"
android:visibility="visible"
android:orientation="vertical">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivEndCall"
android:layout_width="wrap_content"
android:layout_weight="0.25"
android:layout_gravity="center"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:layout_height="0dp"
android:padding="@dimen/_16sdp"
app:srcCompat="@drawable/ic_call_reject" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivSwitchCamera"
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_gravity="center"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_switch_camera" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivDisableVideoCall"
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_video_cam_off" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivMuteVoiceCall"
android:layout_width="0dp"
android:layout_weight="0.33"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_video_mic_on" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/layoutIncomingCall"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_marginBottom="@dimen/_16sdp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivRejectCall"
android:layout_width="0dp"
android:layout_weight="0.1"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_call_reject" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/ivAcceptCall"
android:layout_width="0dp"
android:layout_weight="0.1"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_call_accept" />
</LinearLayout>
</RelativeLayout>
代码部分: 在 onCreate():
surfaceIncomingVideo.holder.addCallback(this)
surfacePreviewCapture.holder.addCallback(previewHandler)
收到预览时:
fun updateVideoPreview(holder: SurfaceHolder) {
if (SipManager.currentCall != null &&
SipManager.currentCall?.mVideoWindow != null &&
SipManager.currentCall?.mVideoPreview != null) {
if (videoPreviewActive) {
val vidWH = VideoWindowHandle()
vidWH.handle?.setWindow(holder.surface)
val vidPrevParam = VideoPreviewOpParam()
vidPrevParam.window = vidWH
try {
SipManager.currentCall?.mVideoPreview?.start(vidPrevParam)
} catch (e: Exception) {
println(e)
}
} else {
try {
SipManager.currentCall?.mVideoPreview?.stop()
} catch (e: Exception) {
println(e)
}
}
}
}
有人可以帮我吗? 提前致谢!
好的,我终于得到了答案。这是因为我设置了旋转相机视图的方向。我认为这是内部 pjsip 问题。
我不会详细介绍如何执行此操作,但总体思路是这样的:
A) 这是 PJSIP 的一个已知/可接受的问题。开发人员已声明其“符合预期”。
B) 解决这个问题需要绕几个圈:
在拨出的电话中添加一个 header,说明您当前的方向。不要,使用 PJSIP 更改它。
让您的 SIP 服务器将此 header 转发到目标客户端。
让目标客户阅读此 header 并在 android 端旋转视频。
我正在处理这个问题,因为我们正在谈论这个问题,并且有方向到达我的观点。我是 android 开发的新手,所以我现在需要弄清楚如何旋转表面视图(setRotation 不起作用...)以及如何在方向改变时向客户端发送额外的请求。
但这就是基本思想......如果你想摆脱酒吧并处理黑酒吧,那就是要走的路。