- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用最后一个 LibVLC 为 Android 应用创建视频播放器。
问题是我不知道这个库是如何工作的,我找不到示例来帮助我(正如这里所说的 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;
}
}
为了启动 videoPlayerActivity,我调用了 start(Context context, Uri uri)
它将创建 Activity 。
要恢复此代码:
oncreat()
之后我调用onResum()
这将调用 mSurfaceHolder.addCallback(mSurfaceCallback);
这个回调调用 startVideo()
应该开始播放视频,但没有开始..
因此,如果有人有关于如何使用上一个 LibVLC 创建简单视频播放器的示例,或者有我失败的想法,那将会很有帮助
最佳答案
请查看我创建的以下示例存储库。它没有所有花里胡哨的东西,但它只是播放任何有效的视频 url。它使用 mrmaffen 友情提供的 VLC SDK:
关于java - 使用 LibVLC for android 创建视频播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30941173/
我正在开发一个 Android 项目,我想使用 LibVLC 创建一个媒体播放器。要使用此库创建媒体播放器,我需要实例化 LibVLC 对象。但是当我尝试这样做时,实例化将失败并且应用程序将自动关闭。
我下载了 vlc-2.2.4-win32.7z 并提取了文件。我在 VS2010 中创建了一个空项目,并使用我在 https://wiki.videolan.org/LibVLC_Tutorial/
当我尝试执行库 Qt-VLC 的示例时出现以下错误 *** glibc detected *** /home/lalalal/Scrivania/SORGENTI/VLC-QT/build-d
我想在Android平台上开发一个Android程序,并且我还编译了一些libs(例如libvlc.so,libvlcjni.so……)。但是在我构建了这些库之后,我还发现了一些Java代码,一个名为
我正在开发一个利用 Caprica's VLCJ Bindings 的程序. 这对 Windows 和 Mac 来说很好,因为我可以将它们的 VLC 库打包到一个 zip 文件中,并在适当的地方将它们
我目前正在尝试使用LibVLC播放视频,有一些问题: 在具有多个屏幕的计算机上,如何让 LibVLC 在特定屏幕上显示全屏? 我尝试使用 libvlc_video_set_marquee_int。经过
有没有支持 Http Adaptive Streaming 的开源流媒体解决方案?根据我的研究,VLC 不支持自适应流媒体。我不确定 Darwin 流服务器。有什么想法吗? 最佳答案 我看到了它们,但
我目前正在尝试使用LibVLC播放视频,有一些问题: 在具有多个屏幕的计算机上,如何让 LibVLC 在特定屏幕上显示全屏? 我尝试使用 libvlc_video_set_marquee_int。经过
我试图在播放音频文件时设置音量,但它似乎根本不起作用。请问我做错了什么? # create a vlc playable object from source self.playable = vlc.
我有一个 .NET Framework 项目 A 的解决方案,它构建了一个包含类 MyPlayer 的 winforms 应用程序,它需要 LibVLCSharp。为了正确构建和运行应用程序,我必须添
嗨,我有这个代码来流式传输一些视频 package video; import javax.swing.*; import java.awt.*; import java.io.File; impor
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试使用 LibVLC 解码视频文件并将其渲染为纹理。 打开和开始播放的代码有效,音频播放完美,但像素缓冲区始终填充0xCD。我尝试在 VLC 上渲染的视频,甚至在 C# 实现中我也能正常工作,
我有这个代码: public class MediaPanel { public static void main(final String[] args) {
我对使用媒体编解码器还很陌生,我尝试使用 Java 播放媒体文件并进行了一些研究,我发现 vlcj 绑定(bind)符合我的需要。我希望将 libvlc native 库与我的应用程序中的插件模块捆绑
在 vlc 中有一些我在 libvlc 中找不到的视频效果,当我在 vlc 中打开视频时,我可以转到“工具->效果和滤镜->视频效果”,然后有很多视频效果我可以使用,例如否定颜色或降噪器或色调分离器等
我制作了 qt 快速应用程序,我需要制作一个带有视频的声明性小部件(我不想使用 qt mobility)。就像,这不是问题。但我不知道如何做模糊 libVLC。有谁知道如何使用 libVLC 制作模糊
我正在尝试在 LibVLC 中设置日志记录,但遇到了一些问题。 我使用的函数是libvlc_log_set_file,文档如下: LibVLC logging docs 这是我现在的代码: //hea
我正在编写 GTK/VLC 程序。与普通媒体播放器一样,我的程序应按如下方式运行: 双击播放列表(使用GtkTreeView实现)使播放器(使用libvlc_media_player实现)播放选定的媒
我正在使用 libvlc,我想检查媒体位置/路径是否有效: libvlc_instance_t* inst = libvlc_new(0, NULL); libvlc_media_t* m = lib
我是一名优秀的程序员,十分优秀!