doikki / dkvideoplayer Goto Github PK
View Code? Open in Web Editor NEWAndroid Video Player. 安卓视频播放器,封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载,列表播放,悬浮播放,广告播放,弹幕,视频水印,视频滤镜
License: Apache License 2.0
Android Video Player. 安卓视频播放器,封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载,列表播放,悬浮播放,广告播放,弹幕,视频水印,视频滤镜
License: Apache License 2.0
我现在的项目,用的是Android原生的Mediaplayer来播放音乐的, 有个问题就是,首次打开播放一首音乐的时候,现在正在处于缓冲状态, 然而用户直接就拖动进度条到了中间,可是出现的效果就是 缓冲完了 又重新跑到了起点位置开始播放了, 我下载你的demo看了下,你用Mediaplayer来播放声音就没有出现这个情况,还有我发现我的onPrepared 方法和你的一毛一样,不知道为啥我就实现不了你的效果,你的demo中,我拖动到了中间,然后它就会在中间的位置开始缓冲, 缓冲好之后就在中间的位置开始播放了! 求大神给个思路 你这个是怎么实现的呢?
现在对于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。
这样的好处是视频的画面被大面积截掉,几乎不会让用户感觉观看时画面有太大损失。
列表悬浮播放没法全屏播放吗?
试了下,SD卡下的视频文件播放不了,提示请重试
目前发现引用x86与 armba 两个平台的so文件,打包出来多出来5-6M ,请问有什么好优化的吗
Environment: Nexus 5, Android API 23
Description:
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]
抖音视频播放横竖屏切换你有什么建议
运行recylerview自动播放demo,发现最后一个不会自动播放,只能手动点击
用户应该是习惯了右边是音量调节,左边是亮度调节,而且主流的视频播放器都是这么设置,不知道作者反着是有何用意,还有就是能否开放接口,设置音量调节和亮度调节在左或是在右的这么一个功能,这样开发者就可以自由设置了
还有是否能开放更多的接口出来,例如:是否可以自由设置播放按钮,是否可以自定义进度条的颜色,或是提供获取对应view,让开发者自由设置
边播放边缓存,但是到中间不到两分钟的时候就会监听到错误(出了点小问题,然后重试),有可能是视频源的问题么
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)
在抖音的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();
}
}
会一直循环播放广告,如果点击跳过第二个视频将会没有广告,不知道这种情况能有办法解决吗?
你好!
我在列表使用带广告的ListVideoView时,用savingProgress()保存播放进度无效
这么好的库,楼主用了一小部分的Java8 语法,但是增加了 别人接入的时间复杂度,建议整一套Java7的
两个视频同时播,只有一个是正常的。
我在运行demo的时候 大部分都提示这个,视频基本都不能播放,难道是我网络问题、?我想问下博主有没有能看的直播源,我想试下rtmp的直播源是否可以播放。
要是能添加一个功能 像b站那样 一进视频提示从上次播放时间播放就更完美了
添加依赖时 我将
# 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'.
求解决办法老哥
你好,请问这支持继续播放吗?我指的是在列表里播放一条后,然后滚动列表,当前播放滚出屏幕列表后就停止了,当再次滚回来时再次播放能不能接着上次播放的地方接着播放。
需求是这样的,列表播放情况下,没有全屏键,点击视频进入竖着的全屏,全屏状态下有全屏按键,点击全屏键是在全屏状态下横竖屏切换,类似微博播放视频,demo里没看到这种效果,求指点怎么实现
java.lang.ArithmeticException: divide by zero
at com.dueeeke.videoplayer.widget.ResizeTextureView.onMeasure(ResizeTextureView.java:80)
<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
当视频在播放时,收到推送消息时,视频被暂停,但是推送结束后无法自动继续播放,需要点击播放
http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
enableCache后无法播放
播放视频之后滑动seekbar 会触发viewpager的滑动,如何解决?
依赖项目运行时出现以下问题 菜鸟求助
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手机上抖音播放时上下不会有黑色边距。
您好,请问一下如何支持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是在无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)
不然开启小窗后,还能再开启一个小窗然后就会崩掉
请问如何播放本地视频?
你好,我在列表点击播放的时候发现播放前都会有黑屏闪一下的情况,我怀疑是不视频的宽高比例和封面的宽高比例不一致的原因造成。
当使用移动网络时,因为播放器检测到没有连接wifi,此时弹出“是否继续播放”的提示框,
这个时候居中裁剪模式失效了,变成了默认模式播放。
https://jitpack.io/com/github/dueeeke/dkplayer/2.3/build.log
查看了一下构建日志,好像失败了
你好!我在实现滑动自动播放的功能,然后在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);
}
}
});
但好像都没有解决这个问题,想请教一下.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.