Giter Site home page Giter Site logo

doikki / dkvideoplayer Goto Github PK

View Code? Open in Web Editor NEW
4.9K 69.0 1.0K 97.99 MB

Android Video Player. 安卓视频播放器,封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载,列表播放,悬浮播放,广告播放,弹幕,视频水印,视频滤镜

License: Apache License 2.0

Java 96.31% Shell 1.59% Kotlin 1.88% GLSL 0.23%
android video player ijkplayer mediaplayer exoplayer tiktok ffmpeg video-player opengl

dkvideoplayer's Introduction

DKVideoPlayer

A video player for Android.

Maven Central API

中文 | English

遇到问题

  1. 阅读 sample:dkplayer-sample
  2. 阅读 wiki 或者 常见问题
  3. 阅读源码
  4. 提交 issue 或者联系我:[email protected]

交流

QQ群:758154597

License

Copyright (c) 2017 Doikki

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

dkvideoplayer's People

Contributors

ansnail avatar cczhr avatar doikki avatar hailouwang avatar rsorin avatar tusantrey2 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dkvideoplayer's Issues

推送视频被暂停

当视频在播放时,收到推送消息时,视频被暂停,但是推送结束后无法自动继续播放,需要点击播放

记忆播放

要是能添加一个功能 像b站那样 一进视频提示从上次播放时间播放就更完美了

如何支持UDP 地址播放?

您好,请问一下如何支持udp地址的视频流播放?例如 udp://@238.1.238.2:5002 这个地址?

日志如下:

01-01 00:15:32.308 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_native_setup
01-01 00:15:32.308 3346-3346/com.tianchi.launcher I/IJKMEDIA: av_version_info: ff3.4--ijk0.8.7--20180103--001
01-01 00:15:32.308 3346-3346/com.tianchi.launcher I/IJKMEDIA: ijk_version_info: k0.8.8
01-01 00:15:32.309 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_create_from_android()
01-01 00:15:32.309 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_inject_opaque(0x1d200522)
01-01 00:15:32.309 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_inject_opaque()=void
01-01 00:15:32.310 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0x1d200522)
01-01 00:15:32.311 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void
01-01 00:15:32.311 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()
01-01 00:15:32.311 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback
01-01 00:15:32.311 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void
01-01 00:15:32.311 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setOptionLong
01-01 00:15:32.312 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setOptionLong
01-01 00:15:32.312 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setOptionLong
01-01 00:15:32.313 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_reset
01-01 00:15:32.313 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_release
01-01 00:15:32.313 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)
01-01 00:15:32.313 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_set_surface()
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)=void
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()=void
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_native_setup
01-01 00:15:32.314 3346-3346/com.tianchi.launcher I/IJKMEDIA: av_version_info: ff3.4--ijk0.8.7--20180103--001
01-01 00:15:32.314 3346-3346/com.tianchi.launcher I/IJKMEDIA: ijk_version_info: k0.8.8
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_create_from_android()
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_inject_opaque(0x1d200526)
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_inject_opaque()=void
01-01 00:15:32.314 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0x1d200526)
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_dec_ref(): ref=0
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()=void
01-01 00:15:32.315 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setOptionLong
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setLoopCount
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_reset
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_release
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_set_surface()
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)=void
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()=void
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_native_setup
01-01 00:15:32.316 3346-3346/com.tianchi.launcher I/IJKMEDIA: av_version_info: ff3.4--ijk0.8.7--20180103--001
01-01 00:15:32.316 3346-3346/com.tianchi.launcher I/IJKMEDIA: ijk_version_info: k0.8.8
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_create_from_android()
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_inject_opaque(0x1d20052a)
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_inject_opaque()=void
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0x1d20052a)
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_dec_ref(): ref=0
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()
01-01 00:15:32.316 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_shutdown_l()=void
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setOptionLong
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setLoopCount
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_setDataSourceAndHeaders
01-01 00:15:32.317 3346-3346/com.tianchi.launcher V/IJKMEDIA: setDataSource: path udp://@238.1.238.1:5001
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_data_source(url="udp://@238.1.238.1:5001")
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_set_data_source(url="udp://@238.1.238.1:5001")=0
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: IjkMediaPlayer_prepareAsync
01-01 00:15:32.317 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_prepare_async()
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: ===== versions =====
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: ijkplayer : k0.8.8
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: FFmpeg : ff3.4--ijk0.8.7--20180103--001
01-01 00:15:32.317 3346-3468/com.tianchi.launcher I/IJKMEDIA: SDL_RunThread: [3468] ff_msg_loop
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: libavutil : 55.78.100
01-01 00:15:32.317 3346-3468/com.tianchi.launcher D/IJKMEDIA: message_loop
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: libavcodec : 57.107.100
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: libavformat : 57.83.100
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: libswscale : 4.8.100
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: libswresample: 2.9.100
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: ===== options =====
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: player-opts : loop = 0
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: format-opts : ijkapplication = 1609291440
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: format-opts : ijkiomanager = 1638854080
01-01 00:15:32.317 3346-3346/com.tianchi.launcher I/IJKMEDIA: ===================
01-01 00:15:32.318 3346-3468/com.tianchi.launcher D/IJKMEDIA: FFP_MSG_FLUSH:
01-01 00:15:32.319 3346-3469/com.tianchi.launcher I/IJKMEDIA: SDL_RunThread: [3469] ff_vout
01-01 00:15:32.319 3346-3346/com.tianchi.launcher D/IJKMEDIA: ijkmp_prepare_async()=0
01-01 00:15:32.319 3346-3470/com.tianchi.launcher I/IJKMEDIA: SDL_RunThread: [3470] ff_read

列表点击后有闪动现象

你好,我在列表点击播放的时候发现播放前都会有黑屏闪一下的情况,我怀疑是不视频的宽高比例和封面的宽高比例不一致的原因造成。

居中裁剪模式有bug

java.lang.ArithmeticException: divide by zero
    at com.dueeeke.videoplayer.widget.ResizeTextureView.onMeasure(ResizeTextureView.java:80)

SCREEN_SCALE_CENTER_CROP 效果有待优化

现在对于SCREEN_SCALE_CENTER_CROP的判断过于简单粗暴,会导致观看一些视频时被截掉一大半,比如抖音示例,如果播放的视频比例是9:16的,那么此时效果很好,如果播放的视频比例是16:9,那么效果就很差了,有一半画面看不到。

能否根据以下情景作调整:
情景1:用户手持竖屏,播放的视频也是竖屏(如9:16),那么使用SCREEN_SCALE_CENTER_CROP。
情景2:用户手持横屏,播放的视频也是横屏(如16:9),那么使用SCREEN_SCALE_CENTER_CROP。
情景2:用户手持竖屏,播放的视频却是横屏(如16:9),那么使用SCREEN_SCALE_DEFAULT。
情景2:用户手持横屏,播放的视频却是竖屏(如9:16),那么使用SCREEN_SCALE_DEFAULT。

这样的好处是视频的画面被大面积截掉,几乎不会让用户感觉观看时画面有太大损失。

请教个问题

我现在的项目,用的是Android原生的Mediaplayer来播放音乐的, 有个问题就是,首次打开播放一首音乐的时候,现在正在处于缓冲状态, 然而用户直接就拖动进度条到了中间,可是出现的效果就是 缓冲完了 又重新跑到了起点位置开始播放了, 我下载你的demo看了下,你用Mediaplayer来播放声音就没有出现这个情况,还有我发现我的onPrepared 方法和你的一毛一样,不知道为啥我就实现不了你的效果,你的demo中,我拖动到了中间,然后它就会在中间的位置开始缓冲, 缓冲好之后就在中间的位置开始播放了! 求大神给个思路 你这个是怎么实现的呢?

无wifi状态下,抖音效果直接崩溃,原因是空指针异常。。。。

学生党无意中找到了您的代码,作为安卓的新手来说真的非常好用,这里先给您说声谢谢,非常感谢您的分享,

其次我找到的bug是在无wifi的情况下,使用打开douyinActivity会直接崩溃,貌似是找不到提示正在使用移动网络的那个对象了

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.dueeeke.videoplayer.widget.StatusView.setMessage(java.lang.String)' on a null object reference
at com.dueeeke.videoplayer.controller.BaseVideoController.showStatusView(BaseVideoController.java:102)
at com.dueeeke.videoplayer.player.IjkVideoView.checkNetwork(IjkVideoView.java:194)
at com.dueeeke.videoplayer.player.IjkVideoView.startPlay(IjkVideoView.java:117)
at com.dueeeke.videoplayer.player.BaseIjkVideoView.start(BaseIjkVideoView.java:216)

在抖音demo上加广告出现bug

在抖音的demo上加入广告

public class DouYinActivity extends AppCompatActivity {

    private static final String TAG = "DouYinActivity";
    private ListIjkVideoView mIjkVideoView;
    private DouYinController mDouYinController;
    private VerticalViewPager mVerticalViewPager;
    private DouYinAdapter mDouYinAdapter;
    private List<VideoBean> mVideoList;
    private List<View> mViews = new ArrayList<>();
    private int mCurrentPosition;
    private int mPlayingPosition;

    private static final String URL_AD = "https://gslb.miaopai.com/stream/IR3oMYDhrON5huCmf7sHCfnU5YKEkgO2.mp4";

    private static final String URL_VOD = "http://mov.bn.netease.com/open-movie/nos/flv/2017/01/03/SC8U8K7BC_hd.flv";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_douyin);

        setStatusBarTransparent();

        mIjkVideoView = new ListIjkVideoView(this);
        PlayerConfig config = new PlayerConfig.Builder().setLooping().build();
        mIjkVideoView.setPlayerConfig(config);
        mDouYinController = new DouYinController(this);
        mIjkVideoView.setVideoController(mDouYinController);
        mVerticalViewPager = findViewById(R.id.vvp);
        mVideoList = DataUtil.getDouYinVideoList();
        for (VideoBean item : mVideoList) {
            View view = LayoutInflater.from(this).inflate(R.layout.item_douyin, null);
            ImageView imageView = view.findViewById(R.id.thumb);
            Glide.with(this).load(item.getThumb()).into(imageView);
            mViews.add(view);
        }

        mDouYinAdapter = new DouYinAdapter(mViews);
        mVerticalViewPager.setAdapter(mDouYinAdapter);

        mVerticalViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {


            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//                Log.e(TAG, "mCurrentId == " + position + ", positionOffset == " + positionOffset +
//                        ", positionOffsetPixels == " + positionOffsetPixels);
            }

            @Override
            public void onPageSelected(int position) {
                Log.d(TAG, "position: " + position);
                mCurrentPosition = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                Log.d(TAG, "onPageScrollStateChanged: " + state);
                if (mPlayingPosition == mCurrentPosition) return;
                if (state == VerticalViewPager.SCROLL_STATE_IDLE) {
                    mIjkVideoView.release();
                    ViewParent parent = mIjkVideoView.getParent();
                    if (parent != null && parent instanceof FrameLayout) {
                        ((FrameLayout) parent).removeView(mIjkVideoView);
                    }
                    startPlay();
                }
            }
        });
        //自动播放第一条
        mVerticalViewPager.post(this::startPlay);
    }

    private void startPlay() {
        View view = mViews.get(mCurrentPosition);
        FrameLayout frameLayout = view.findViewById(R.id.container);
        ImageView imageView = view.findViewById(R.id.thumb);
        mDouYinController.getThumb().setImageDrawable(imageView.getDrawable());
        frameLayout.addView(mIjkVideoView);
        List<VideoModel> videos = new ArrayList<>();
        AdController adController = new AdController(this);
        videos.add(new VideoModel(URL_AD, "广告", adController, true));
        videos.add(new VideoModel(mVideoList.get(mCurrentPosition).getUrl(), "这是一个标题", new StandardVideoController(this), true));
        mIjkVideoView.setVideos(videos);
        mIjkVideoView.setScreenScale(IjkVideoView.SCREEN_SCALE_CENTER_CROP);
        mIjkVideoView.start();
        mPlayingPosition = mCurrentPosition;
    }

    /**
     * 把状态栏设成透明
     */
    private void setStatusBarTransparent() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            View decorView = DouYinActivity.this.getWindow().getDecorView();
            decorView.setOnApplyWindowInsetsListener((v, insets) -> {
                WindowInsets defaultInsets = v.onApplyWindowInsets(insets);
                return defaultInsets.replaceSystemWindowInsets(
                        defaultInsets.getSystemWindowInsetLeft(),
                        0,
                        defaultInsets.getSystemWindowInsetRight(),
                        defaultInsets.getSystemWindowInsetBottom());
            });
            ViewCompat.requestApplyInsets(decorView);
            getWindow().setStatusBarColor(ContextCompat.getColor(this, android.R.color.transparent));
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        mIjkVideoView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mIjkVideoView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mIjkVideoView.release();
    }
}

会一直循环播放广告,如果点击跳过第二个视频将会没有广告,不知道这种情况能有办法解决吗?

关于recyclerview自动播放的逻辑

你好!我在实现滑动自动播放的功能,然后在IjkVideoView上面添加了一个view用来显示当前视频的相关信息,想要的效果是视频播放的时候隐藏掉IjkVideoView上面那个view,视频停止播放就显示那个view,然后出现一个问题,就是有时候停止播放的那个IjkVideoView上面的view没有显示出来.我的逻辑是加在这里的
if (fl_video != null) {
Rect rect = new Rect();
fl_video.getLocalVisibleRect(rect);
int videoHeight = fl_video.getHeight();
if (rect.top == 0 && rect.bottom == videoHeight) {
ijkVideoView.start();
//todo
ll_info.setVisibility(View.INVISIBLE);
iv_image.setVisibility(View.INVISIBLE);
return;
}else {
ijkVideoView.stopPlayback();
ll_info.setVisibility(View.VISIBLE);
iv_image.setVisibility(View.VISIBLE);
}

                }

或者加在这里
recyclerView.setAdapter(adapter);
recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
@OverRide
public void onChildViewAttachedToWindow(View view) {

        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {
            IjkVideoView ijkVideoView = (IjkVideoView) view.findViewById(R.id.video_player);
            RelativeLayout ll_info = (RelativeLayout) view.findViewById(R.id.ll_video_surfaceinfo);
            RoundedImageView iv_image = (RoundedImageView) view.findViewById(R.id.iv_image);
            if (ijkVideoView != null && !ijkVideoView.isFullScreen()) {

// Log.d("@@@@@@", "onChildViewDetachedFromWindow: called");
// int tag = (int) ijkVideoView.getTag();
// Log.d("@@@@@@", "onChildViewDetachedFromWindow: position: " + tag);
ijkVideoView.stopPlayback();
ll_info.setVisibility(View.VISIBLE);
iv_image.setVisibility(View.VISIBLE);

            }
        }
    });

但好像都没有解决这个问题,想请教一下.

建议

这么好的库,楼主用了一小部分的Java8 语法,但是增加了 别人接入的时间复杂度,建议整一套Java7的

插播广告

哈喽,如果要在视频任意位置加入广告视频,这个能实现不?谢谢

全屏播放画幅出问题

老哥是不是最近改了哪里啊,画幅突然出问题了,用手机全屏拍摄未裁剪拍的视频播放出来突然就变小了,我在setPlayerState 的 case IjkVideoView.PLAYER_FULL_SCREEN: 中设置画幅setScreenScale也不起作用了,如图所示
_20180515155230

Video stops playing before finishing

Environment: Nexus 5, Android API 23
Description:

  1. The user downloads the demo application and opens it
  2. The user tries Auto Play Recycler View demo
  3. Play any video.
  4. There is high chance that the video stops somewhere before it finishes playing the entire video.
  5. The view will go back to initial state (only show thumbnail and play button)

PS: You can use Mandarin to reply and I'd love to give more specific description if you want (no Chinese input method installed on my laptop 2333).
my email address: [email protected]

居中裁剪模式bug

当使用移动网络时,因为播放器检测到没有连接wifi,此时弹出“是否继续播放”的提示框,
这个时候居中裁剪模式失效了,变成了默认模式播放。

添加依赖的时候报错

添加依赖时 我将

# required, enough for most devices.
implementation 'com.github.dueeeke.dkplayer:dkplayer-java:2.4.0'
implementation 'com.github.dueeeke.dkplayer:dkplayer-armv7a:2.4.0'

# Other ABIs: optional
implementation 'com.github.dueeeke.dkplayer:dkplayer-armv5:2.4.0'
implementation 'com.github.dueeeke.dkplayer:dkplayer-arm64:2.4.0'
implementation 'com.github.dueeeke.dkplayer:dkplayer-x86:2.4.0'
implementation 'com.github.dueeeke.dkplayer:dkplayer-x86_64:2.4.0'

改成

//required, enough for most devices.
compile 'com.github.dueeeke.dkplayer:dkplayer-java:2.4.0'
compile 'com.github.dueeeke.dkplayer:dkplayer-armv7a:2.4.0'
// Other ABIs: optional
compile 'com.github.dueeeke.dkplayer:dkplayer-armv5:2.4.0'
compile 'com.github.dueeeke.dkplayer:dkplayer-arm64:2.4.0'
compile 'com.github.dueeeke.dkplayer:dkplayer-x86:2.4.0'
compile 'com.github.dueeeke.dkplayer:dkplayer-x86_64:2.4.0'

报错无法
D:\Demo\ProgressView-master\sample\build\intermediates\res\merged\debug\values-v26\values-v26.xml
Error:(15, 21) No resource found that matches the given name: attr 'android:keyboardNavigationCluster'.
Error:(15, 21) No resource found that matches the given name: attr 'android:keyboardNavigationCluster'.
求解决办法老哥

recylerview自动播放

运行recylerview自动播放demo,发现最后一个不会自动播放,只能手动点击

编译问题

依赖项目运行时出现以下问题 菜鸟求助

Error:com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
Error:com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\bird.gradle\caches\transforms-1\files-1.1\dkplayer-1.4.3.aar\f901af77260aac2fb095a0d389097849\jars\classes.jar
Error:com.android.builder.dexing.DexArchiveBuilderException: Error while dexing com/dueeeke/videoplayer/player/IjkVideoView.class
Error:Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.

com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\bird.gradle\caches\transforms-1\files-1.1\dkplayer-1.4.3.aar\f901af77260aac2fb095a0d389097849\jars\classes.jar

竖屏显示时无法强制全屏播放

比如要播放的视频是9:16的 分辨率是 1080*1920 ,希望在竖屏状态时可以铺满全屏,现在小米mix2手机上或其他的18:9的全面屏手机,SCREEN_SCALE_DEFAULT 设置为这个播放的时候,上下会留有黑色边距,没有铺满全屏,希望可以像抖音那样,强制铺满全屏,但是画面又不拉伸。已验证抖音的视频都是9:16的,且在小米mix2手机上抖音播放时上下不会有黑色边距。

音量调节和亮度调节是不是反了

用户应该是习惯了右边是音量调节,左边是亮度调节,而且主流的视频播放器都是这么设置,不知道作者反着是有何用意,还有就是能否开放接口,设置音量调节和亮度调节在左或是在右的这么一个功能,这样开发者就可以自由设置了
还有是否能开放更多的接口出来,例如:是否可以自由设置播放按钮,是否可以自定义进度条的颜色,或是提供获取对应view,让开发者自由设置

播放某些MP4的视频 报错

com.danikula.videocache.ProxyCacheException: Error opening connection for http://v11-dy.ixigua.com/d7b74eb4aeef00f0c742d88e91af1e0a/5ad44b79/video/m/2205a1f000b42334a25a55c3c53b07ba066115402240000cbe323002791/ with offset 496000. Version: 2.7.0
at com.danikula.videocache.HttpUrlSource.open(HttpUrlSource.java:75)
at com.danikula.videocache.ProxyCache.readSource(ProxyCache.java:123)
at com.danikula.videocache.ProxyCache.access$100(ProxyCache.java:19)
at com.danikula.videocache.ProxyCache$SourceReaderRunnable.run(ProxyCache.java:187)
at java.lang.Thread.run(Thread.java:762)
Caused by: java.io.FileNotFoundException: http://v11-dy.ixigua.com/d7b74eb4aeef00f0c742d88e91af1e0a/5ad44b79/video/m/2205a1f000b42334a25a55c3c53b07ba066115402240000cbe323002791/
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:254)
at com.danikula.videocache.HttpUrlSource.open(HttpUrlSource.java:70)
at com.danikula.videocache.ProxyCache.readSource(ProxyCache.java:123) 
at com.danikula.videocache.ProxyCache.access$100(ProxyCache.java:19) 
at com.danikula.videocache.ProxyCache$SourceReaderRunnable.run(ProxyCache.java:187) 
at java.lang.Thread.run(Thread.java:762) 

问一下缓存的问题

边播放边缓存,但是到中间不到两分钟的时候就会监听到错误(出了点小问题,然后重试),有可能是视频源的问题么

Seekbar设置selector为什么在非seekbar的区域 按下 press也触发selector的press图标?

    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:background="@null"
        android:max="1000"
        android:maxHeight="1dp"
        android:minHeight="1dp"
        android:progressDrawable="@drawable/player_progressbar"
        android:splitTrack="false"
        android:thumb="@drawable/seekbar_thumb"
        android:thumbOffset="8dp"/>

视频缓存问题

04-20 18:44:41.508 10141-10141/com.mvpow.tingjian E/DKPlayer: STATE_PREPARING 04-20 18:44:41.509 10141-10141/com.mvpow.tingjian E/DKPlayer: PLAYER_NORMAL 04-20 18:44:43.685 10141-10184/com.mvpow.tingjian W/OkHttpClient: A connection to http://127.0.0.1:33090/ was leaked. Did you forget to close a response body? 04-20 18:44:43.685 10141-10184/com.mvpow.tingjian I/chatty: uid=10245(u0_a245) OkHttp Connecti identical 2 lines 04-20 18:44:43.685 10141-10184/com.mvpow.tingjian W/OkHttpClient: A connection to http://127.0.0.1:33090/ was leaked. Did you forget to close a response body? 04-20 18:44:43.689 10141-10586/com.mvpow.tingjian E/HttpProxyCacheServer: HttpProxyCacheServer error com.danikula.videocache.ProxyCacheException: Error closing socket input stream. Version: 2.7.0 at com.danikula.videocache.HttpProxyCacheServer.closeSocketInput(HttpProxyCacheServer.java:285) at com.danikula.videocache.HttpProxyCacheServer.releaseSocket(HttpProxyCacheServer.java:270) at com.danikula.videocache.HttpProxyCacheServer.processSocket(HttpProxyCacheServer.java:243) at com.danikula.videocache.HttpProxyCacheServer.access$200(HttpProxyCacheServer.java:52) at com.danikula.videocache.HttpProxyCacheServer$SocketProcessorRunnable.run(HttpProxyCacheServer.java:338) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.io.IOException: shutdown failed: ENOTCONN (Transport endpoint is not connected) at java.net.PlainSocketImpl.socketShutdown(PlainSocketImpl.java:267) at java.net.AbstractPlainSocketImpl.shutdownInput(AbstractPlainSocketImpl.java:582) at java.net.Socket.shutdownInput(Socket.java:1565) at com.danikula.videocache.HttpProxyCacheServer.closeSocketInput(HttpProxyCacheServer.java:278) at com.danikula.videocache.HttpProxyCacheServer.releaseSocket(HttpProxyCacheServer.java:270)  at com.danikula.videocache.HttpProxyCacheServer.processSocket(HttpProxyCacheServer.java:243)  at com.danikula.videocache.HttpProxyCacheServer.access$200(HttpProxyCacheServer.java:52)  at com.danikula.videocache.HttpProxyCacheServer$SocketProcessorRunnable.run(HttpProxyCacheServer.java:338)  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)  at java.lang.Thread.run(Thread.java:764)  Caused by: android.system.ErrnoException: shutdown failed: ENOTCONN (Transport endpoint is not connected) at libcore.io.Linux.shutdown(Native Method) at libcore.io.ForwardingOs.shutdown(ForwardingOs.java:176) at java.net.PlainSocketImpl.socketShutdown(PlainSocketImpl.java:265) at java.net.AbstractPlainSocketImpl.shutdownInput(AbstractPlainSocketImpl.java:582)  at java.net.Socket.shutdownInput(Socket.java:1565)  at com.danikula.videocache.HttpProxyCacheServer.closeSocketInput(HttpProxyCacheServer.java:278)  at com.danikula.videocache.HttpProxyCacheServer.releaseSocket(HttpProxyCacheServer.java:270)  at com.danikula.videocache.HttpProxyCacheServer.processSocket(HttpProxyCacheServer.java:243)  at com.danikula.videocache.HttpProxyCacheServer.access$200(HttpProxyCacheServer.java:52)  at com.danikula.videocache.HttpProxyCacheServer$SocketProcessorRunnable.run(HttpProxyCacheServer.java:338)  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)  at java.lang.Thread.run(Thread.java:764)  04-20 18:44:43.689 10141-10649/com.mvpow.tingjian E/HttpProxyCacheServer: HttpProxyCacheServer error com.danikula.videocache.ProxyCacheException: Error closing socket input stream. Version: 2.7.0 at com.danikula.videocache.HttpProxyCacheServer.closeSocketInput(HttpProxyCacheServer.java:285) at com.danikula.videocache.HttpProxyCacheServer.releaseSocket(HttpProxyCacheServer.java:270) at com.danikula.videocache.HttpProxyCacheServer.processSocket(HttpProxyCacheServer.java:243) at com.danikula.videocache.HttpProxyCacheServer.access$200(HttpProxyCacheServer.java:52) at com.danikula.videocache.HttpProxyCacheServer$SocketProcessorRunnable.run(HttpProxyCacheServer.java:338) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.io.IOException: shutdown failed: ENOTCONN (Transport endpoint is not connected) at java.net.PlainSocketImpl.socketShutdown(PlainSocketImpl.java:267) at java.net.AbstractPlainSocketImpl.shutdownInput(AbstractPlainSocketImpl.java:582) at java.net.Socket.shutdownInput(Socket.java:1565) at com.danikula.videocache.HttpProxyCacheServer.closeSocketInput(HttpProxyCacheServer.java:278) at com.danikula.videocache.HttpProxyCacheServer.releaseSocket(HttpProxyCacheServer.java:270)  at com.danikula.videocache.HttpProxyCacheServer.processSocket(HttpProxyCacheServer.java:243)  at com.danikula.videocache.HttpProxyCacheServer.access$200(HttpProxyCacheServer.java:52)  at com.danikula.videocache.HttpProxyCacheServer$SocketProcessorRunnable.run(HttpProxyCacheServer.java:338)  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)  at java.lang.Thread.run(Thread.java:764)  Caused by: android.system.ErrnoException: shutdown failed: ENOTCONN (Transport endpoint is not connected) at libcore.io.Linux.shutdown(Native Method) at libcore.io.ForwardingOs.shutdown(ForwardingOs.java:176) at java.net.PlainSocketImpl.socketShutdown(PlainSocketImpl.java:265) at java.net.AbstractPlainSocketImpl.shutdownInput(AbstractPlainSocketImpl.java:582)  at java.net.Socket.shutdownInput(Socket.java:1565)  at com.danikula.videocache.HttpProxyCacheServer.closeSocketInput(HttpProxyCacheServer.java:278)  at com.danikula.videocache.HttpProxyCacheServer.releaseSocket(HttpProxyCacheServer.java:270)  at com.danikula.videocache.HttpProxyCacheServer.processSocket(HttpProxyCacheServer.java:243)  at com.danikula.videocache.HttpProxyCacheServer.access$200(HttpProxyCacheServer.java:52)  at com.danikula.videocache.HttpProxyCacheServer$SocketProcessorRunnable.run(HttpProxyCacheServer.java:338)  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)  at java.lang.Thread.run(Thread.java:764)  04-20 18:44:43.690 10141-10649/com.mvpow.tingjian W/HttpProxyCacheServer: Failed to close socket on proxy side: shutdown failed: ENOTCONN (Transport endpoint is not connected). It seems client have already closed connection. 04-20 18:44:43.690 10141-10586/com.mvpow.tingjian W/HttpProxyCacheServer: Failed to close socket on proxy side: shutdown failed: ENOTCONN (Transport endpoint is not connected). It seems client have already closed connection. 04-20 18:44:43.910 10141-10141/com.mvpow.tingjian E/DKPlayer: STATE_PREPARED

继续播放问题

你好,请问这支持继续播放吗?我指的是在列表里播放一条后,然后滚动列表,当前播放滚出屏幕列表后就停止了,当再次滚回来时再次播放能不能接着上次播放的地方接着播放。

提示:出了点小问题,请稍后再试

我在运行demo的时候 大部分都提示这个,视频基本都不能播放,难道是我网络问题、?我想问下博主有没有能看的直播源,我想试下rtmp的直播源是否可以播放。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.