使用适用于 Android 的 LibVLC 创建视频播放器

2024-03-08

我正在尝试使用最后一个 LibVLC 为 Android 应用程序创建一个视频播放器。

问题是我不知道这个库是如何工作的,而且我找不到示例来帮助我(正如这里所说https://bitbucket.org/edwardcw/libvlc-android-sample https://bitbucket.org/edwardcw/libvlc-android-sample)

所以我尝试自己创建视频播放器:

public class VideoPlayerActivity extends AppCompatActivity implements IVideoPlayer, GestureDetector.OnDoubleTapListener, IDelayController {

private static LibVLC LibVLC() {
    return VLCInstance.get();
}

private static MediaPlayer MediaPlayer() {
    return VLCInstance.getMainMediaPlayer();
}

@Override
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Toast.makeText(getApplicationContext(), "Ca start VideoPlayerActivity !!", Toast.LENGTH_SHORT).show();
    if (!VLCInstance.testCompatibleCPU(this)) {
       // exit(RESULT_CANCELED);
        return;
    }
    extras = getIntent().getExtras();
    mUri = extras.getParcelable(PLAY_EXTRA_ITEM_LOCATION);
    Toast.makeText(getApplicationContext(), "Oui ça start le VideoPlayer", Toast.LENGTH_SHORT).show();
    setContentView(R.layout.player_test);
}

@Override
public  void onResume() {
    super.onResume();

    mSurfaceView = (SurfaceView) findViewById(R.id.player_surface_test);
    setSurfaceLayout(100, 100, 100, 100, 100, 100);
    mSurfaceHolder = mSurfaceView.getHolder();
    mSurfaceFrame = (FrameLayout) findViewById(R.id.player_surface_frame_test);
    mSurfaceHolder.addCallback(mSurfaceCallback);
}

private static class ConfigureSurfaceHolder {
    private final Surface surface;
    private boolean configured;

    private ConfigureSurfaceHolder(Surface surface) {
        this.surface = surface;
    }
}

@Override
public void setSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den) {

    /*if (width * height == 0)
        return;*/

    // store video size
    mVideoHeight = height;
    mVideoWidth = width;
    mVideoVisibleHeight = visible_height;
    mVideoVisibleWidth  = visible_width;
    mSarNum = sar_num;
    mSarDen = sar_den;
   Toast.makeText(this, "mVideoHeight = " + mVideoHeight, Toast.LENGTH_SHORT).show();
}

@Override
public int configureSurface(Surface surface, final int width, final int height, final int hal) {
    if (AndroidUtil.isICSOrLater() || surface == null)
        return -1;
    if (width * height == 0)
        return 0;
    Log.i(TAG, "configureSurface: " + width +"x"+height);

    final ConfigureSurfaceHolder holder = new ConfigureSurfaceHolder(surface);

    final Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            if (mSurface == holder.surface && mSurfaceHolder != null) {
                if (hal != 0)
                    mSurfaceHolder.setFormat(hal);
                mSurfaceHolder.setFixedSize(width, height);
            }
            synchronized (holder) {
                holder.configured = true;
                holder.notifyAll();
            }
        }
    });
    try {
        synchronized (holder) {
            while (!holder.configured)
                holder.wait();
        }
    } catch (InterruptedException e) {
        return 0;
    }
    return 1;
}

@Override
public void eventHardwareAccelerationError() {
}

private void startVideo() {
    // LibVLC lib = new LibVLC();
    mMediaPlayer = VLCInstance.getMainMediaPlayer();
    Media media = new Media(VLCInstance.get(), mUri.getPath());
    media.parse();
    Toast.makeText(this, "le media dure : "+media.getDuration(), Toast.LENGTH_SHORT).show();
   // Toast.makeText(this, "le media dure : "+media., Toast.LENGTH_SHORT).show();
    mMediaPlayer.setMedia(media);
    //mMediaPlayer.setVideoTrackEnabled(true);
    //media.release();
   // mMediaPlayer.setEqualizer(VLCOptions.getEqualizer());
   // mMediaPlayer.setVideoTitleDisplay(MediaPlayer.Position.Disable, 0);
    int sw = getWindow().getDecorView().getWidth();
    int sh = getWindow().getDecorView().getHeight();
    VLCInstance.get().setWindowSize(sw, sh);
    mMediaPlayer.play();
    Toast.makeText(this, "le player a une valeur de : "+mMediaPlayer.isPlaying(), Toast.LENGTH_SHORT).show();
   // media.parse();
   // media.release();
   // mMediaPlayer.setMedia(media);
   // mMediaPlayer.play();
}

private final SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() {
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if(MediaPlayer() != null) {
            width = 100;
            height =100;
            Toast.makeText(getApplicationContext(), "surface width = "+width, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), "surface height = "+height, Toast.LENGTH_SHORT).show();
            final Surface newSurface = holder.getSurface();
            if (mSurface != newSurface) {
                mSurface = newSurface;
                Toast.makeText(getApplicationContext(), "surfaceChanged: " + mSurface, Toast.LENGTH_SHORT).show();
                LibVLC().attachSurface(mSurface, VideoPlayerActivity.this);
                mSurfaceReady = true;
                startVideo();
                //mHandler.sendEmptyMessage(1);
            }
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i(TAG, "surfaceDestroyed");
        if(MediaPlayer() != null) {
            mSurface = null;
            LibVLC().detachSurface();
            mSurfaceReady = false;
        }
    }
};

private final Handler mHandler = new VideoPlayerHandler(this);

private static class VideoPlayerHandler extends WeakHandler<VideoPlayerActivity> {
    public VideoPlayerHandler(VideoPlayerActivity owner) {
        super(owner);
    }

    @Override
    public void handleMessage(Message msg) {
        VideoPlayerActivity activity = getOwner();
        if(activity == null) // WeakReference could be GC'ed early
            return;

        switch (msg.what) {
            case 1:
                activity.startVideo();
                break;
            default:
                break;
        }
    }
};

public static void start(Context context, Uri uri) {
    start(context, uri, null, false, -1);
}

public static void start(Context context, Uri uri, boolean fromStart) {
    start(context, uri, null, fromStart, -1);
}

public static void start(Context context, Uri uri, String title) {
    start(context, uri, title, false, -1);
}

private static void start(Context context, Uri uri, String title, boolean fromStart, int openedPosition) {
    Intent intent = new Intent(context, VideoPlayerActivity.class);


    intent.setAction(PLAY_FROM_VIDEOGRID);
    intent.putExtra(PLAY_EXTRA_ITEM_LOCATION, uri);
    intent.putExtra(PLAY_EXTRA_ITEM_TITLE, title);
    intent.putExtra(PLAY_EXTRA_FROM_START, fromStart);
    intent.putExtra(PLAY_EXTRA_OPENED_POSITION, openedPosition);

    /*if (openedPosition != -1)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);*/
    Toast.makeText(context, "uri = "+uri.toString(), Toast.LENGTH_SHORT).show();
    context.startActivity(intent);  // /!\ start the activity /!\ !!!
}

@Override
public void showAudioDelaySetting() {

}

@Override
public void showSubsDelaySetting() {

}

@Override
public void endDelaySetting() {

}

@Override
public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
    return false;
}

@Override
public boolean onDoubleTap(MotionEvent motionEvent) {
    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent motionEvent) {
    return false;
}
}

要启动我调用的 videoPlayerActivitystart(Context context, Uri uri)它将创建活动。

要恢复此代码:

之后oncreat() I call onResum()这将调用一个mSurfaceHolder.addCallback(mSurfaceCallback);和这个回调调用startVideo()应该开始视频,但没有开始..

因此,如果有人有如何使用最后一个 LibVLC 创建简单视频播放器的示例或我失败的想法,那将会很有帮助


请参阅下面我创建的示例存储库。它没有所有的花哨功能,但它只是播放任何有效的视频网址。它使用 mrmaffen 善意提供的 VLC SDK:

https://github.com/gareoke/VLCPlayer https://github.com/gareoke/VLCPlayer

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用适用于 Android 的 LibVLC 创建视频播放器 的相关文章

  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • react-native android fontFamily 不生效

    问题一 我在index android js的欢迎样式中添加了fontFamily 但没有效果 fontFamily 真的可以在 Android 上使用吗 欢迎 字体大小 20 fontFamily roboto thin 文本对齐 居中
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • 在线性布局内的 ScrollView 内并排对齐 TextView

    我有一个带有滚动视图的线性布局 我想保留它的当前格式 但只需将 textView2a 和 textView3a 并排放置 而不会破坏我当前的布局格式 我已经包含了我最近的尝试 但它们似乎不正确 提前致谢 Java菜鸟 当前有效的 XML
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐