Android基于libvlc 播发rtsp视频流

Android基于libvlc 播发rtsp视频流,第1张

概述使用libvlc播放rtsp视频流的appdemo.从官方vlc官方sample上修改而来,下载地址:https://code.videolan.org/videolan/libvlc-android-samplesree/master/官方的sample是播放一个在安装包里面的.m4v的卡通动画,稍作改动,就可以播放rtsp视频流了。(直接下载过来的工程无法使用,缺少

使用libvlc 播放rtsp视频流的app demo.

从官方vlc官方sample上修改而来,下载地址:https://code.vIDeolan.org/vIDeolan/libvlc-android-samples/tree/master/

官方的sample是播放一个在安装包里面的.m4v 的卡通动画,稍作改动,就可以播放rtsp视频流了。(直接下载过来的工程无法使用,缺少 vlc的aar包,编译app也未配置好。个人配置好的包:https://download.csdn.net/download/u012459903/11049974)

把demo里面的 

final Media media = new Media(mlibVLC, getAssets().openFd(ASSET_filename));
改为

final Media media = new Media(mlibVLC, Uri.parse("rtsp://192.168.43.233:10086/stream"));
rtsp地址替换为自己的rtsp,去掉异常捕捉部分,可以在pc上用vlc播放器搭建一个进行测试。

官方的主要源码:

activity:

/*****************************************************************************
* JavaActivity.java
*****************************************************************************
* copyright (C) 2016 VIDeolAN
* All rights reserved.
*
* This software may be modifIEd and distributed under the terms
* of the BSD license. See the liCENSE file for details.
*****************************************************************************/

package org.vIDeolan.javasample;

import androID.annotation.TargetAPI;
import androID.content.res.Configuration;
import androID.graphics.PixelFormat;
import androID.net.Uri;
import androID.os.Build;
import androID.os.Handler;
import androID.support.v7.app.AppCompatActivity;
import androID.os.Bundle;
import androID.util.Log;
import androID.vIEw.SurfaceVIEw;
import androID.vIEw.TextureVIEw;
import androID.vIEw.VIEw;
import androID.vIEw.VIEwGroup;
import androID.vIEw.VIEwStub;
import androID.Widget.FrameLayout;

import org.vIDeolan.libvlc.IVLCVout;
import org.vIDeolan.libvlc.libVLC;
import org.vIDeolan.libvlc.Media;
import org.vIDeolan.libvlc.MediaPlayer;

import java.io.IOException;
import java.util.ArrayList;

public class JavaActivity extends AppCompatActivity implements IVLCVout.OnNewVIDeolayoutListener {
private static final boolean USE_SURFACE_VIEW = true;
private static final boolean ENABLE_SUBTitleS = true;
private static final String TAG = "JavaActivity";
private static final String ASSET_filename = "bbb.m4v";
private static final int SURFACE_BEST_FIT = 0;
private static final int SURFACE_FIT_SCREEN = 1;
private static final int SURFACE_FILL = 2;
private static final int SURFACE_16_9 = 3;
private static final int SURFACE_4_3 = 4;
private static final int SURFACE_ORIGINAL = 5;
private static int CURRENT_SIZE = SURFACE_BEST_FIT;

private FrameLayout mVIDeoSurfaceFrame = null;
private SurfaceVIEw mVIDeoSurface = null;
private SurfaceVIEw mSubTitlesSurface = null;
private TextureVIEw mVIDeoTexture = null;
private VIEw mVIDeoVIEw = null;

private final Handler mHandler = new Handler();
private VIEw.OnLayoutchangelistener mOnLayoutchangelistener = null;

private libVLC mlibVLC = null;
private MediaPlayer mMediaPlayer = null;
private int mVIDeoHeight = 0;
private int mVIDeoWIDth = 0;
private int mVIDeoVisibleHeight = 0;
private int mVIDeoVisibleWIDth = 0;
private int mVIDeoSarNum = 0;
private int mVIDeoSarDen = 0;

@OverrIDe
protected voID onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentVIEw(R.layout.activity_main);

final ArrayList<String> args = new ArrayList<>();
args.add("-vvv");
mlibVLC = new libVLC(this, args);
mMediaPlayer = new MediaPlayer(mlibVLC);

mVIDeoSurfaceFrame = (FrameLayout) findVIEwByID(R.ID.vIDeo_surface_frame);
if (USE_SURFACE_VIEW) {
VIEwStub stub = (VIEwStub) findVIEwByID(R.ID.surface_stub);
mVIDeoSurface = (SurfaceVIEw) stub.inflate();
if (ENABLE_SUBTitleS) {
stub = (VIEwStub) findVIEwByID(R.ID.subTitles_surface_stub);
mSubTitlesSurface = (SurfaceVIEw) stub.inflate();
mSubTitlesSurface.setZOrderMediaOverlay(true);
mSubTitlesSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
}
mVIDeoVIEw = mVIDeoSurface;
}
else
{
VIEwStub stub = (VIEwStub) findVIEwByID(R.ID.texture_stub);
mVIDeoTexture = (TextureVIEw) stub.inflate();
mVIDeoVIEw = mVIDeoTexture;
}
}

@OverrIDe
protected voID onDestroy() {
super.onDestroy();
mMediaPlayer.release();
mlibVLC.release();
}

@OverrIDe
protected voID onStart() {
super.onStart();

final IVLCVout vlcVout = mMediaPlayer.getVLCVout();
if (mVIDeoSurface != null) {
vlcVout.setVIDeoVIEw(mVIDeoSurface);
if (mSubTitlesSurface != null)
vlcVout.setSubTitlesVIEw(mSubTitlesSurface);
}
else
vlcVout.setVIDeoVIEw(mVIDeoTexture);
vlcVout.attachVIEws(this);
/*
try {
// final Media media = new Media(mlibVLC, getAssets().openFd(ASSET_filename));
final Media media = new Media(mlibVLC, Uri.parse("rtsp://192.168.43.14:10086/stream"));
mMediaPlayer.setMedia(media);
media.release();
} catch (IOException e) {
throw new RuntimeException("InvalID asset folder");
}
*/
final Media media = new Media(mlibVLC, Uri.parse("rtsp://192.168.43.233:10086/stream"));
mMediaPlayer.setMedia(media);
media.release();
mMediaPlayer.play();

if (mOnLayoutchangelistener == null) {
mOnLayoutchangelistener = new VIEw.OnLayoutchangelistener() {
private final Runnable mRunnable = new Runnable() {
@OverrIDe
public voID run() {
updateVIDeoSurfaces();
}
};
@OverrIDe
public voID onLayoutChange(VIEw v, int left, int top, int right,
int bottom, int oldleft, int oldtop, int oldRight, int oldBottom) {
if (left != oldleft || top != oldtop || right != oldRight || bottom != oldBottom) {
mHandler.removeCallbacks(mRunnable);
mHandler.post(mRunnable);
}
}
};
}
mVIDeoSurfaceFrame.addOnLayoutchangelistener(mOnLayoutchangelistener);
}

@OverrIDe
protected voID onStop() {
super.onStop();

if (mOnLayoutchangelistener != null) {
mVIDeoSurfaceFrame.removeOnLayoutchangelistener(mOnLayoutchangelistener);
mOnLayoutchangelistener = null;
}

mMediaPlayer.stop();

mMediaPlayer.getVLCVout().detachVIEws();
}

private voID changeMediaPlayerLayout(int displayW, int displayH) {
/* Change the vIDeo placement using the MediaPlayer API */
switch (CURRENT_SIZE) {
case SURFACE_BEST_FIT:
mMediaPlayer.setAspectRatio(null);
mMediaPlayer.setScale(0);
break;
case SURFACE_FIT_SCREEN:
case SURFACE_FILL: {
Media.VIDeoTrack vtrack = mMediaPlayer.getCurrentVIDeoTrack();
if (vtrack == null)
return;
final boolean vIDeoSwapped = vtrack.orIEntation == Media.VIDeoTrack.OrIEntation.leftBottom
|| vtrack.orIEntation == Media.VIDeoTrack.OrIEntation.Righttop;
if (CURRENT_SIZE == SURFACE_FIT_SCREEN) {
int vIDeoW = vtrack.wIDth;
int vIDeoH = vtrack.height;

if (vIDeoSwapped) {
int swap = vIDeoW;
vIDeoW = vIDeoH;
vIDeoH = swap;
}
if (vtrack.sarNum != vtrack.sarDen)
vIDeoW = vIDeoW * vtrack.sarNum / vtrack.sarDen;

float ar = vIDeoW / (float) vIDeoH;
float dar = displayW / (float) displayH;

float scale;
if (dar >= ar)
scale = displayW / (float) vIDeoW; /* horizontal */
else
scale = displayH / (float) vIDeoH; /* vertical */
mMediaPlayer.setScale(scale);
mMediaPlayer.setAspectRatio(null);
} else {
mMediaPlayer.setScale(0);
mMediaPlayer.setAspectRatio(!vIDeoSwapped ? ""+displayW+":"+displayH
: ""+displayH+":"+displayW);
}
break;
}
case SURFACE_16_9:
mMediaPlayer.setAspectRatio("16:9");
mMediaPlayer.setScale(0);
break;
case SURFACE_4_3:
mMediaPlayer.setAspectRatio("4:3");
mMediaPlayer.setScale(0);
break;
case SURFACE_ORIGINAL:
mMediaPlayer.setAspectRatio(null);
mMediaPlayer.setScale(1);
break;
}
}

private voID updateVIDeoSurfaces() {
int sw = getwindow().getDecorVIEw().getWIDth();
int sh = getwindow().getDecorVIEw().getHeight();

// sanity check
if (sw * sh == 0) {
Log.e(TAG, "InvalID surface size");
return;
}

mMediaPlayer.getVLCVout().setwindowsize(sw, sh);

VIEwGroup.LayoutParams lp = mVIDeoVIEw.getLayoutParams();
if (mVIDeoWIDth * mVIDeoHeight == 0) {
/* Case of OpenGL vouts: handles the placement of the vIDeo using MediaPlayer API */
lp.wIDth = VIEwGroup.LayoutParams.MATCH_PARENT;
lp.height = VIEwGroup.LayoutParams.MATCH_PARENT;
mVIDeoVIEw.setLayoutParams(lp);
lp = mVIDeoSurfaceFrame.getLayoutParams();
lp.wIDth = VIEwGroup.LayoutParams.MATCH_PARENT;
lp.height = VIEwGroup.LayoutParams.MATCH_PARENT;
mVIDeoSurfaceFrame.setLayoutParams(lp);
changeMediaPlayerLayout(sw, sh);
return;
}

if (lp.wIDth == lp.height && lp.wIDth == VIEwGroup.LayoutParams.MATCH_PARENT) {
/* We handle the placement of the vIDeo using AndroID VIEw LayoutParams */
mMediaPlayer.setAspectRatio(null);
mMediaPlayer.setScale(0);
}

double DW = sw, dh = sh;
final boolean isPortrait = getResources().getConfiguration().orIEntation == Configuration.ORIENTATION_PORTRAIT;

if (sw > sh && isPortrait || sw < sh && !isPortrait) {
DW = sh;
dh = sw;
}

// compute the aspect ratio
double ar, vw;
if (mVIDeoSarDen == mVIDeoSarNum) {
/* No indication about the density, assuming 1:1 */
vw = mVIDeoVisibleWIDth;
ar = (double)mVIDeoVisibleWIDth / (double)mVIDeoVisibleHeight;
} else {
/* Use the specifIEd aspect ratio */
vw = mVIDeoVisibleWIDth * (double)mVIDeoSarNum / mVIDeoSarDen;
ar = vw / mVIDeoVisibleHeight;
}

// compute the display aspect ratio
double dar = DW / dh;

switch (CURRENT_SIZE) {
case SURFACE_BEST_FIT:
if (dar < ar)
dh = DW / ar;
else
DW = dh * ar;
break;
case SURFACE_FIT_SCREEN:
if (dar >= ar)
dh = DW / ar; /* horizontal */
else
DW = dh * ar; /* vertical */
break;
case SURFACE_FILL:
break;
case SURFACE_16_9:
ar = 16.0 / 9.0;
if (dar < ar)
dh = DW / ar;
else
DW = dh * ar;
break;
case SURFACE_4_3:
ar = 4.0 / 3.0;
if (dar < ar)
dh = DW / ar;
else
DW = dh * ar;
break;
case SURFACE_ORIGINAL:
dh = mVIDeoVisibleHeight;
DW = vw;
break;
}

// set display size
lp.wIDth = (int) Math.ceil(DW * mVIDeoWIDth / mVIDeoVisibleWIDth);
lp.height = (int) Math.ceil(dh * mVIDeoHeight / mVIDeoVisibleHeight);
mVIDeoVIEw.setLayoutParams(lp);
if (mSubTitlesSurface != null)
mSubTitlesSurface.setLayoutParams(lp);

// set frame size (crop if necessary)
lp = mVIDeoSurfaceFrame.getLayoutParams();
lp.wIDth = (int) Math.floor(DW);
lp.height = (int) Math.floor(dh);
mVIDeoSurfaceFrame.setLayoutParams(lp);

mVIDeoVIEw.invalIDate();
if (mSubTitlesSurface != null)
mSubTitlesSurface.invalIDate();
}

@TargetAPI(Build.VERSION_CODES.JELLY_BEAN_MR1)
@OverrIDe
public voID onNewVIDeolayout(IVLCVout vlcVout, int wIDth, int height, int visibleWIDth, int visibleHeight, int sarNum, int sarDen) {
mVIDeoWIDth = wIDth;
mVIDeoHeight = height;
mVIDeoVisibleWIDth = visibleWIDth;
mVIDeoVisibleHeight = visibleHeight;
mVIDeoSarNum = sarNum;
mVIDeoSarDen = sarDen;
updateVIDeoSurfaces();
}
}
 

布局文件:activity_main.xml:

<FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"
xmlns:tools="http://schemas.androID.com/tools"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:keepScreenOn="true"
androID:background="@androID:color/background_dark"
tools:context=".NativeActivity">

<FrameLayout
androID:ID="@+ID/vIDeo_surface_frame"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:layout_gravity="center"
androID:foregroundGravity="clip_horizontal|clip_vertical"
tools:ignore="true">

<VIEwStub
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:layout="@layout/surface_vIEw"
androID:ID="@+ID/surface_stub" />

<VIEwStub
androID:layout_wIDth="1dp"
androID:layout_height="1dp"
androID:layout="@layout/surface_vIEw"
androID:ID="@+ID/subTitles_surface_stub" />

<VIEwStub
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:layout="@layout/texture_vIEw"
androID:ID="@+ID/texture_stub" />

</FrameLayout>
</FrameLayout>
 

surface_vIEw.xml:

<?xml version="1.0" enCoding="utf-8"?>
<SurfaceVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent">
</SurfaceVIEw>
texture_vIEw.xml:

<?xml version="1.0" enCoding="utf-8"?>
<TextureVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent">
</TextureVIEw>

————————————————
版权声明:本文为CSDN博主「白皮书CAN」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012459903/article/details/88739782

总结

以上是内存溢出为你收集整理的Android基于libvlc 播发rtsp视频流全部内容,希望文章能够帮你解决Android基于libvlc 播发rtsp视频流所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1029416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存