I checked this and this links for this problem but couldn't find any solution.
I am implementing an RTSP player in android and I have used Easy Player for this. Using this player I have implementd my demo application and entered an rtsp://
URL.
PROBLEM: When I enter the same URL in library sample code it is working fine, but when I try with my demo app the app crashes with following stacktrace.
04-20 16:13:57.189 26834-26834/com.easydrawindemo A/libc: Fatal signal 11 (SIGSEGV) at 0x00000005 (code=1), thread 26834 (.easydrawindemo)
04-20 16:13:57.219 1163-1163/? D/BubblePopupHelper: isShowingBubblePopup : false
04-20 16:13:57.289 292-292/? I/DEBUG: [04-20 16:13:57.295]
04-20 16:13:57.289 292-292/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-20 16:13:57.289 292-292/? I/DEBUG: Build fingerprint: 'lge/g3_global_com/g3:4.4.2/KVT49L.D85510i/D85510i.1403169216:user/release-keys'
04-20 16:13:57.289 292-292/? I/DEBUG: Revision: '10'
04-20 16:13:57.289 292-292/? I/DEBUG: pid: 26834, tid: 26834, name: .easydrawindemo >>> com.easydrawindemo <<<
04-20 16:13:57.289 292-292/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000005
04-20 16:13:57.289 971-1151/? D/WifiStateMachine: handleMessage: E msg.what=131155
04-20 16:13:57.289 971-1151/? D/WifiStateMachine: processMsg: ConnectedState
04-20 16:13:57.289 971-1151/? D/WifiStateMachine: processMsg: L2ConnectedState
04-20 16:13:57.289 971-1151/? D/WifiNative-wlan0: doString: SIGNAL_POLL
04-20 16:13:57.289 971-1182/? W/NativeCrashListener: Couldn't find ProcessRecord for pid 1529885741
And here is my fragment class:
public class PlayerFragment extends Fragment implements TextureView.SurfaceTextureListener, PhotoViewAttacher.OnMatrixChangedListener {
private TextureView videoSurfaceView;
private ProgressBar pBarVideo;
private String videoUrl;
private int transType;
protected EasyRTSPClient mStreamRender;
protected ResultReceiver mResultReceiver;
private MediaScannerConnection mScanner;
private int mWidth, mHeight;
private PhotoViewAttacher mAttacher;
private static final String TAG = "PlayerFragment";
public static final int RESULT_REND_STARTED = 1;
public static final int RESULT_REND_VIDEO_DISPLAYED = 2;
public static final int RESULT_REND_STOPED = -1;
private ResultReceiver mRR;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setLandscapeOrientation();
Log.i(TAG, "onCreate called");
if (getArguments() != null) {
Log.i(TAG, "onCreate if called");
videoUrl = getArguments().getString(Constants.KEY_VIDEO_URL);
transType = getArguments().getInt(Constants.KEY_PROTOCOL_TYPE);
mRR = getArguments().getParcelable(Constants.KEY_RESULT_RECEIVER);
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_player, container, false);
Log.i(TAG, "onCreateView called");
videoSurfaceView = (TextureView) view.findViewById(R.id.videoSurfaceView);
videoSurfaceView.setOpaque(false);
videoSurfaceView.setSurfaceTextureListener(this);
pBarVideo = (ProgressBar) view.findViewById(R.id.pBarVideo);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.i(TAG, "onViewCreated called");
mResultReceiver = new ResultReceiver(new Handler()) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
PlayerActivity activity = (PlayerActivity) getActivity();
if (activity == null)return;
if (resultCode == EasyRTSPClient.RESULT_VIDEO_DISPLAYED) {
Log.i(TAG, "ResultReceiver RESULT_VIDEO_DISPLAYED called");
// onVideoDisplayed();
}
else if (resultCode == EasyRTSPClient.RESULT_VIDEO_SIZE) {
Log.i(TAG, "ResultReceiver RESULT_VIDEO_SIZE called");
mWidth = resultData.getInt(EasyRTSPClient.EXTRA_VIDEO_WIDTH);
mHeight = resultData.getInt(EasyRTSPClient.EXTRA_VIDEO_HEIGHT);
// onVideoSizeChange();
}
else if (resultCode == EasyRTSPClient.RESULT_TIMEOUT) {
Log.i(TAG, "ResultReceiver RESULT_TIMEOUT called");
new AlertDialog.Builder(getActivity()).setMessage("Timeout").setTitle("SORRY").setPositiveButton(android.R.string.ok, null).show();
}
else if (resultCode == EasyRTSPClient.RESULT_UNSUPPORTED_AUDIO) {
Log.i(TAG, "ResultReceiver RESULT_UNSUPPORTED_AUDIO called");
new AlertDialog.Builder(getActivity()).setMessage("Unsupported Audio").setTitle("SORRY").setPositiveButton(android.R.string.ok, null).show();
}
else if (resultCode == EasyRTSPClient.RESULT_UNSUPPORTED_VIDEO) {
Log.i(TAG, "ResultReceiver RESULT_UNSUPPORTED_VIDEO called");
new AlertDialog.Builder(getActivity()).setMessage("Unsupported Video").setTitle("SORRY").setPositiveButton(android.R.string.ok, null).show();
}
else if (resultCode == EasyRTSPClient.RESULT_EVENT){
Log.i(TAG, "ResultReceiver RESULT_EVENT called");
int errorcode = resultData.getInt("errorcode");
if (errorcode != 0){
stopRendering();
}
// activity.onEvent(PlayFragment.this, errorcode,resultData.getString("event-msg"));
}
// else if (resultCode == EasyRTSPClient.RESULT_RECORD_BEGIN){
// activity.onRecordState(1);
// }
// else if (resultCode == EasyRTSPClient.RESULT_RECORD_END){
// activity.onRecordState(-1);
// }
}
};
if (mAttacher != null) {
mAttacher.cleanup();
}
mAttacher = new PhotoViewAttacher(videoSurfaceView, mWidth, mHeight);
mAttacher.setScaleType(ImageView.ScaleType.CENTER_CROP);
mAttacher.setOnMatrixChangeListener(PlayerFragment.this);
mAttacher.update();
}
public static PlayerFragment getInstance(String URL, int type, ResultReceiver rr) {
Log.i(TAG, "getInstance called");
PlayerFragment playerFragment = new PlayerFragment();
Bundle bundle = new Bundle();
bundle.putString(Constants.KEY_VIDEO_URL, URL);
bundle.putInt(Constants.KEY_PROTOCOL_TYPE, type);
bundle.putParcelable(Constants.KEY_RESULT_RECEIVER, rr);
playerFragment.setArguments(bundle);
return playerFragment;
}
private void setLandscapeOrientation() {
Log.i(TAG, "setLandscapeOrientation called");
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
Log.i(TAG, "onSurfaceTextureAvailable called");
startRendering(surfaceTexture);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
Log.i(TAG, "onSurfaceTextureSizeChanged called");
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
Log.i(TAG, "onSurfaceTextureDestroyed called");
stopRendering();
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
Log.i(TAG, "onSurfaceTextureUpdated called");
}
private void startRendering(SurfaceTexture surface) {
Log.i(TAG, "startRendering called");
mStreamRender = new EasyRTSPClient(getActivity(), "79393674363536526D343241654D7859707A4F484A655A76636D63755A57467A65575268636E64706269356C59584E356347786865575679567778576F502B6C34456468646D6C754A6B4A68596D397A595541794D4445325257467A65555268636E6470626C526C5957316C59584E35", surface, mResultReceiver);
// boolean autoRecord = PreferenceManager.getDefaultSharedPreferences(getContext()).getBoolean("auto_record", false);
// File f = new File(TheApp.sMoviePath);
// f.mkdirs();
try {
mStreamRender.start(videoUrl, transType, RTSPClient.EASY_SDK_VIDEO_FRAME_FLAG | RTSPClient.EASY_SDK_AUDIO_FRAME_FLAG, "", "", null);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
// mStreamRender.start2(mUrl, mType);
mRR.send(RESULT_REND_STARTED, null);
}
private void stopRendering() {
Log.i(TAG, "stopRendering called");
if (mStreamRender != null) {
mRR.send(RESULT_REND_STOPED, null);
mStreamRender.stop();
mStreamRender = null;
}
}
@Override
public void onMatrixChanged(RectF rectF) {
Log.i(TAG, "onMatrixChanged called");
}
}
I have tried almost everything but couldn't find solution for this. Please correct me if I have done anything wrong and provide me a solution.
Thanks in advance.
I found my mistake, in Easy player, a unique key is generated for every package name and in my case that key was incorrect. I don't know why it is giving memory leakage error for an invalid key!! Replacing package name and key solved this problem. Strange but true.