提交 14de057c authored 作者: kongdywang's avatar kongdywang

1. After the player UI component enters full-screen mode, to avoid compatibility…

1. After the player UI component enters full-screen mode, to avoid compatibility issues, it no longer forcibly breaks layout restrictions to fill the screen. Now, the business side needs to manually hide unnecessary components and remove height limitations on the player. 2. Fixed an issue where the video did not display in certain live streaming scenarios. 3. Removed the cross-version problematic `LinkedListEntry` from the player UI component to avoid cross-version compatibility issues. 4. Added the `setDrmProvisionEnv` interface in `SuperPlayerPlugin` for configuring the DRM certificate environment. 5. Upgraded to version 12.5.1. 6. Fixed an issue where Android video-on-demand using `SurfaceView` would not display video when switching between foreground and background. 7. Fixed a license configuration error when launching the demo app.
上级 d04ded8d
#### Version: 12.5.1 2025.05.29
##### Features:
- set Android TXLiteAVSDK_Player to 12.5.0.17576,tag:release_player_v12.5.1
- set iOS TXLiteAVSDK_Player to 12.5.18393, tag:release_player_v12.5.1
- The `SuperPlayerPlugin` has added the `setDrmProvisionEnv` method for switching the DRM playback environment.
- Fixed an issue where the video screen could not be restored when returning to the foreground from the background while using SurfaceView on the Android side.
- Fix the issue where the UI component's fullscreen operation behaves unexpectedly on some older Android devices.
#### Version: 12.5.0 2025.05.08
##### Features:
......
......@@ -5,7 +5,7 @@ buildLog() {
}
inputVersion=$1
export VERSION_NAME="12.5.0"
export VERSION_NAME="12.5.1"
if [ -n "$inputVersion" ]; then
VERSION_NAME=$inputVersion
fi
......
......@@ -17,13 +17,9 @@ android {
namespace="com.tencent.vod.flutter"
defaultConfig {
buildConfigField("String", "FLUTTER_PLAYER_VERSION", "\"${rootProject.ext.playerVersion}\"")
minSdkVersion rootProject.ext.minSdkVersion
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
......
......@@ -4,7 +4,7 @@ rootProject.ext {
supportSdkVersion = "26.0.1"
minSdkVersion = 19
targetSdkVersion = 28
playerVersion = "12.5.0"
playerVersion = "12.5.1"
compat = "androidx.appcompat:appcompat:1.6.1"
/**
......@@ -14,5 +14,5 @@ rootProject.ext {
Professional SDK: liteavSdk="com.tencent.liteav:LiteAVSDK_Professional:latest.release"
If you want to specify the SDK version(eg 11.7.0.13946), use: liteavSdk="com.tencent.liteav:LiteAVSDK_Player:11.7.0.13946"
*/
liteavSdk="com.tencent.liteav:LiteAVSDK_Player:12.5.0.17567"
liteavSdk="com.tencent.liteav:LiteAVSDK_Player:12.5.0.17576"
}
\ No newline at end of file
......@@ -30,6 +30,7 @@ import com.tencent.liteav.base.util.LiteavLog;
import com.tencent.rtmp.TXLiveBase;
import com.tencent.rtmp.TXLiveBaseListener;
import com.tencent.rtmp.TXPlayerGlobalSetting;
import com.tencent.vod.flutter.common.FTXPlayerConstants;
import com.tencent.vod.flutter.messages.FtxMessages;
import com.tencent.vod.flutter.messages.FtxMessages.BoolMsg;
import com.tencent.vod.flutter.messages.FtxMessages.DoubleMsg;
......@@ -184,6 +185,7 @@ public class SuperPlayerPlugin implements FlutterPlugin, ActivityAware,
flutterPluginBinding
.getPlatformViewRegistry()
.registerViewFactory(FTXEvent.FTX_RENDER_VIEW, mRenderViewFactory);
LiteavLog.i(TAG, "plugin version is:" + BuildConfig.FLUTTER_PLAYER_VERSION);
TXFlutterSuperPlayerPluginAPI.setUp(flutterPluginBinding.getBinaryMessenger(), this);
TXFlutterNativeAPI.setUp(flutterPluginBinding.getBinaryMessenger(), this);
mPluginApi = new FtxMessages.TXPluginFlutterAPI(flutterPluginBinding.getBinaryMessenger());
......@@ -340,6 +342,15 @@ public class SuperPlayerPlugin implements FlutterPlugin, ActivityAware,
}
}
@Override
public void setDrmProvisionEnv(@NonNull Long env) {
if (env == FTXPlayerConstants.FTXDrmProvisionEnvInt.DRM_PROVISION_ENV_CN) {
TXPlayerGlobalSetting.setDrmProvisionEnv(TXPlayerGlobalSetting.DrmProvisionEnv.DRM_PROVISION_ENV_CN);
} else {
TXPlayerGlobalSetting.setDrmProvisionEnv(TXPlayerGlobalSetting.DrmProvisionEnv.DRM_PROVISION_ENV_COM);
}
}
/******* native method call end *******/
......
......@@ -6,7 +6,7 @@ public class FTXPlayerConstants {
/**
* 根据视频比例,完整展示出视频画面
* Display the video content fully according to the video aspect ratio.
* Display the video content fully according to the video aspect ratio.
*/
long ADJUST_RESOLUTION = 0;
......@@ -23,4 +23,11 @@ public class FTXPlayerConstants {
long SCALE_FULL_FILL_CONTAINER = 2;
}
public interface FTXDrmProvisionEnvInt {
long DRM_PROVISION_ENV_COM = 0;
long DRM_PROVISION_ENV_CN = 1;
}
}
......@@ -3989,6 +3989,8 @@ public class FtxMessages {
void setLicenseFlexibleValid(@NonNull BoolMsg msg);
void setDrmProvisionEnv(@NonNull Long env);
/** The codec used by TXFlutterSuperPlayerPluginAPI. */
static @NonNull MessageCodec<Object> getCodec() {
return PigeonCodec.INSTANCE;
......@@ -4329,6 +4331,29 @@ public class FtxMessages {
api.setLicenseFlexibleValid(msgArg);
wrapped.add(0, null);
}
catch (Throwable exception) {
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger, "dev.flutter.pigeon.super_player.TXFlutterSuperPlayerPluginAPI.setDrmProvisionEnv" + messageChannelSuffix, getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<>();
ArrayList<Object> args = (ArrayList<Object>) message;
Long envArg = (Long) args.get(0);
try {
api.setDrmProvisionEnv(envArg);
wrapped.add(0, null);
}
catch (Throwable exception) {
wrapped = wrapError(exception);
}
......
......@@ -65,7 +65,6 @@ public class FTXLivePlayer extends FTXLivePlayerRenderHost implements TXFlutterL
private boolean mIsPaused = false;
private final FtxMessages.TXLivePlayerFlutterAPI mLiveFlutterApi;
private final FTXRenderViewFactory mRenderViewFactory;
private FTXRenderView mCurRenderView;
private final Handler mUIHandler = new Handler(Looper.getMainLooper());
private boolean mIsMute = false;
private int mCurrentVideoWidth = 0;
......@@ -464,14 +463,11 @@ public class FTXLivePlayer extends FTXLivePlayerRenderHost implements TXFlutterL
public void setPlayerView(@NonNull Long renderViewId) {
int viewId = renderViewId.intValue();
FTXRenderView renderView = mRenderViewFactory.findViewById(viewId);
if (null != renderView) {
mCurRenderView = renderView;
renderView.setPlayer(this);
} else {
LiteavLog.e(TAG, "setPlayerView can not find renderView by id:" + viewId + ", release player's renderView");
mCurRenderView = null;
setRenderView(null);
if (null == renderView) {
LiteavLog.e(TAG, "setPlayerView can not find renderView by id:"
+ viewId + ", release player's renderView");
}
setUpPlayerView(renderView);
}
@Override
......
......@@ -45,6 +45,7 @@ import com.tencent.vod.flutter.messages.FtxMessages.UInt8ListMsg;
import com.tencent.vod.flutter.model.TXPipResult;
import com.tencent.vod.flutter.model.TXPlayerHolder;
import com.tencent.vod.flutter.player.render.FTXVodPlayerRenderHost;
import com.tencent.vod.flutter.tools.FTXVersionAdapter;
import com.tencent.vod.flutter.tools.TXCommonUtil;
import com.tencent.vod.flutter.tools.TXFlutterEngineHolder;
import com.tencent.vod.flutter.ui.render.FTXRenderView;
......@@ -249,9 +250,8 @@ public class FTXVodPlayer extends FTXVodPlayerRenderHost implements ITXVodPlayLi
mVodPlayer.setRenderMode(TXLiveConstants.RENDER_MODE_ADJUST_RESOLUTION);
// prevent config null exception
TXVodPlayConfig playConfig = new TXVodPlayConfig();
Map<String, Object> map = new HashMap<>();
map.put("450", 0);
playConfig.setExtInfo(map);
FTXVersionAdapter.enableCustomSubtitle(playConfig, 0);
FTXVersionAdapter.enableDrmLevel3(playConfig, true);
mVodPlayer.setConfig(playConfig);
mVodPlayer.setVodSubtitleDataListener(new ITXVodPlayListener.ITXVodSubtitleDataListener() {
@Override
......@@ -406,13 +406,8 @@ public class FTXVodPlayer extends FTXVodPlayerRenderHost implements ITXVodPlayLi
void setPlayConfig(FTXVodPlayConfigPlayerMsg config) {
if (mVodPlayer != null) {
TXVodPlayConfig playConfig = FTXTransformation.transformToVodConfig(config);
Map<String, Object> map = new HashMap<>();
Map<String, Object> extInfoMap = playConfig.getExtInfoMap();
if (extInfoMap != null && !extInfoMap.isEmpty()) {
map.putAll(extInfoMap);
}
map.put("450", 0);
playConfig.setExtInfo(map);
FTXVersionAdapter.enableCustomSubtitle(playConfig, 0);
FTXVersionAdapter.enableDrmLevel3(playConfig, true);
mVodPlayer.setConfig(playConfig);
}
}
......
......@@ -8,13 +8,16 @@ import android.view.TextureView;
import com.tencent.liteav.base.util.LiteavLog;
import com.tencent.live2.V2TXLivePlayer;
import com.tencent.vod.flutter.player.FTXBasePlayer;
import com.tencent.vod.flutter.ui.render.CarrierViewObserver;
import com.tencent.vod.flutter.ui.render.FTXRenderCarrier;
import com.tencent.vod.flutter.ui.render.FTXRenderView;
public abstract class FTXLivePlayerRenderHost extends FTXBasePlayer implements FTXPlayerRenderHost {
public abstract class FTXLivePlayerRenderHost extends FTXBasePlayer implements FTXPlayerRenderHost,
CarrierViewObserver {
private static final String TAG = "FTXLivePlayerRenderHost";
protected FTXRenderView mCurRenderView;
private boolean isTargetDetached = false;
@Override
public void setUpPlayerView(FTXRenderView renderView) {
......@@ -32,10 +35,12 @@ public abstract class FTXLivePlayerRenderHost extends FTXBasePlayer implements F
@Override
public void setRenderView(FTXRenderCarrier textureView) {
final V2TXLivePlayer livePlayer = getLivePlayer();
isTargetDetached = false;
if (null != textureView) {
LiteavLog.i(TAG, "start bind Player:" + textureView + ", player:" + hashCode());
if (textureView instanceof TextureView) {
livePlayer.setRenderView((TextureView) textureView);
textureView.addViewObserver(this);
} else if (textureView instanceof SurfaceView) {
livePlayer.setRenderView((SurfaceView) textureView);
} else {
......@@ -45,6 +50,21 @@ public abstract class FTXLivePlayerRenderHost extends FTXBasePlayer implements F
LiteavLog.i(TAG, "setRenderView met a null textureView, player:" + hashCode());
livePlayer.setRenderView((TextureView) null);
livePlayer.setRenderView((SurfaceView) null);
if (null != mCurRenderView && mCurRenderView.getRenderView() != null) {
mCurRenderView.getRenderView().removeViewObserver(this);
}
}
}
@Override
public void onDetachWindow(FTXRenderCarrier carrier) {
isTargetDetached = true;
}
@Override
public void onAttachWindow(FTXRenderCarrier carrier) {
if (isTargetDetached && null != mCurRenderView) {
setUpPlayerView(mCurRenderView);
}
}
......
......@@ -23,7 +23,7 @@ public class FTXEGLRender implements SurfaceTexture.OnFrameAvailableListener {
private static final String TAG = "FTXEGLRender";
private static final long FRAME_WAIT_TIME = 5000;
private static final int FPS_DEFAULT = 60;
private static final int FPS_DEFAULT = 30;
private SurfaceTexture mSurfaceTexture;
private FTXTextureRender mTextureRender;
......
package com.tencent.vod.flutter.tools;
import android.text.TextUtils;
import com.tencent.liteav.base.util.LiteavLog;
import com.tencent.rtmp.TXVodConstants;
import com.tencent.rtmp.TXVodPlayConfig;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class FTXVersionAdapter {
private static final String TAG = "FTXVersionAdapter";
public static void enableCustomSubtitle(TXVodPlayConfig config, int isOpen) {
if (null == config) {
config = new TXVodPlayConfig();
}
Map<String, Object> extInfo = safeGetExtInfo(config);
String customKeyName = getVodKeyValue("PLAYER_OPTION_KEY_SUBTITLE_OUTPUT_TYPE");
if (null != customKeyName) {
extInfo.put(customKeyName, isOpen);
config.setExtInfo(extInfo);
}
}
public static void enableDrmLevel3(TXVodPlayConfig config, boolean isOpen) {
if (null == config) {
config = new TXVodPlayConfig();
}
Map<String, Object> extInfo = safeGetExtInfo(config);
String customKeyName = getVodKeyValue("VOD_USE_DRM_L3");
if (null != customKeyName) {
extInfo.put(customKeyName, isOpen);
config.setExtInfo(extInfo);
}
}
private static Map<String, Object> safeGetExtInfo(TXVodPlayConfig config) {
Map<String, Object> extInfo = config.getExtInfoMap();
if (extInfo == null) {
extInfo = new HashMap<>();
}
//noinspection UnnecessaryLocalVariable
Map<String, Object> canModifyMap = new HashMap<>(extInfo);
return canModifyMap;
}
public static String getVodKeyValue(String paramDeclareName) {
try {
Class<?> clazz = TXVodConstants.class;
Field field = clazz.getDeclaredField(paramDeclareName);
field.setAccessible(true);
Object value = field.get(null);
return (String) value;
} catch (NoSuchFieldException | IllegalAccessException e) {
LiteavLog.e(TAG, "vod key obtain failed, maybe version is too low", e);
}
return null;
}
}
package com.tencent.vod.flutter.ui.render;
public interface CarrierViewObserver {
void onAttachWindow(FTXRenderCarrier carrier);
void onDetachWindow(FTXRenderCarrier carrier);
}
......@@ -2,6 +2,9 @@ package com.tencent.vod.flutter.ui.render;
import com.tencent.vod.flutter.player.render.FTXPlayerRenderSurfaceHost;
import java.lang.ref.WeakReference;
import java.util.List;
public interface FTXRenderCarrier {
void bindPlayer(FTXPlayerRenderSurfaceHost surfaceHost);
......@@ -18,4 +21,11 @@ public interface FTXRenderCarrier {
void destroyRender();
void addViewObserver(CarrierViewObserver observer);
void removeViewObserver(CarrierViewObserver observer);
void removeAllViewObserver();
List<WeakReference<CarrierViewObserver>> getViewObservers();
}
......@@ -72,6 +72,7 @@ public class FTXRenderView implements PlatformView {
+ ",new:" + player + ", view:" + hashCode());
if (null != mBasePlayer) {
mBasePlayer.setRenderView(null);
mTextureView.removeAllViewObserver();
clearTexture();
}
mBasePlayer = player;
......@@ -99,6 +100,7 @@ public class FTXRenderView implements PlatformView {
@Override
public void dispose() {
mFactory.removeByViewId(mViewId);
mContainer.setCarrier(null);
LiteavLog.i(TAG, "render view is dispose, id:" + mViewId + ", view:" + hashCode());
}
}
......@@ -14,6 +14,11 @@ import com.tencent.vod.flutter.player.render.FTXPlayerRenderSurfaceHost;
import com.tencent.vod.flutter.player.render.gl.FTXEGLRender;
import com.tencent.vod.flutter.player.render.gl.GLSurfaceTools;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FTXSurfaceView extends SurfaceView implements SurfaceHolder.Callback, FTXRenderCarrier {
private static final String TAG = "FTXSurfaceView";
......@@ -29,6 +34,7 @@ public class FTXSurfaceView extends SurfaceView implements SurfaceHolder.Callbac
private int mViewHeight = 0;
private final Object mLayoutLock = new Object();
private FTXEGLRender mRender;
private final List<WeakReference<CarrierViewObserver>> mViewObservers = new ArrayList<>();
public FTXSurfaceView(Context context) {
super(context);
......@@ -67,6 +73,29 @@ public class FTXSurfaceView extends SurfaceView implements SurfaceHolder.Callbac
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
LiteavLog.i(TAG, "target onDetachedFromWindow,view:" + hashCode());
mRender.stopRender();
for (WeakReference<CarrierViewObserver> observer : mViewObservers) {
if (observer.get() != null) {
observer.get().onDetachWindow(this);
}
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LiteavLog.i(TAG, "target onAttachedToWindow,view:" + hashCode());
for (WeakReference<CarrierViewObserver> observer : mViewObservers) {
if (observer.get() != null) {
observer.get().onAttachWindow(this);
}
}
}
@Override
public void updateRenderMode(long renderMode) {
if (mRenderMode != renderMode) {
......@@ -172,6 +201,39 @@ public class FTXSurfaceView extends SurfaceView implements SurfaceHolder.Callbac
@Override
public void destroyRender() {
mRender.stopRender();
removeAllViewObserver();
}
@Override
public void addViewObserver(CarrierViewObserver observer) {
if (null != observer) {
mViewObservers.add(new WeakReference<>(observer));
}
}
@Override
public void removeViewObserver(CarrierViewObserver observer) {
int removeIndex = -1;
for (int i = 0; i < mViewObservers.size(); i++) {
WeakReference<CarrierViewObserver> observerWeakReference = mViewObservers.get(i);
if (observerWeakReference.get() == observer) {
removeIndex = i;
break;
}
}
if (removeIndex >= 0) {
mViewObservers.remove(removeIndex);
}
}
@Override
public void removeAllViewObserver() {
mViewObservers.clear();
}
@Override
public List<WeakReference<CarrierViewObserver>> getViewObservers() {
return mViewObservers;
}
@Override
......
......@@ -6,8 +6,16 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import com.tencent.liteav.base.util.LiteavLog;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
public class FTXTextureContainer extends FrameLayout {
private static final String TAG = "FTXTextureContainer";
private FTXRenderCarrier mTextureHolder;
public FTXTextureContainer(@NonNull Context context) {
......@@ -15,21 +23,41 @@ public class FTXTextureContainer extends FrameLayout {
}
public synchronized void setCarrier(FTXRenderCarrier carrier) {
LiteavLog.i(TAG, "called setUp new carrier:" + carrier + ",view:" + hashCode());
if (mTextureHolder != carrier) {
if (null == carrier) {
LiteavLog.i(TAG, "start remove old carrier:" + mTextureHolder + ",view:" + hashCode());
removeView((View) mTextureHolder);
mTextureHolder.destroyRender();
} else {
List<WeakReference<CarrierViewObserver>> mOldObservers = new ArrayList<>();
if (null != mTextureHolder) {
removeView((View) mTextureHolder);
mOldObservers.addAll(mTextureHolder.getViewObservers());
mTextureHolder.destroyRender();
}
for (WeakReference<CarrierViewObserver> ref : mOldObservers) {
carrier.addViewObserver(ref.get());
}
LiteavLog.i(TAG, "start add new carrier:" + carrier + ",view:" + hashCode());
addView((View) carrier);
}
mTextureHolder = carrier;
}
}
@Override
public void removeAllViews() {
super.removeAllViews();
LiteavLog.i(TAG, "target removeAllViews,view:" + hashCode());
}
@Override
public void removeView(View view) {
super.removeView(view);
LiteavLog.i(TAG, "target removeView, child:" + view + ",view:" + hashCode());
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
......
......@@ -15,6 +15,11 @@ import com.tencent.vod.flutter.player.render.FTXPlayerRenderSurfaceHost;
import com.tencent.vod.flutter.player.render.gl.FTXEGLRender;
import com.tencent.vod.flutter.player.render.gl.GLSurfaceTools;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FTXTextureView extends TextureView implements TextureView.SurfaceTextureListener, FTXRenderCarrier {
private static final String TAG = "FTXTextureView";
......@@ -30,6 +35,7 @@ public class FTXTextureView extends TextureView implements TextureView.SurfaceTe
private int mViewHeight = 0;
private final Object mLayoutLock = new Object();
private FTXEGLRender mRender;
private final List<WeakReference<CarrierViewObserver>> mViewObservers = new ArrayList<>();
public FTXTextureView(@NonNull Context context) {
super(context);
......@@ -153,6 +159,29 @@ public class FTXTextureView extends TextureView implements TextureView.SurfaceTe
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
LiteavLog.i(TAG, "target onDetachedFromWindow,view:" + hashCode());
mRender.stopRender();
for (WeakReference<CarrierViewObserver> observer : mViewObservers) {
if (observer.get() != null) {
observer.get().onDetachWindow(this);
}
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LiteavLog.i(TAG, "target onAttachedToWindow,view:" + hashCode());
for (WeakReference<CarrierViewObserver> observer : mViewObservers) {
if (observer.get() != null) {
observer.get().onAttachWindow(this);
}
}
}
@Override
public void setSurfaceTexture(@NonNull SurfaceTexture surfaceTexture) {
super.setSurfaceTexture(surfaceTexture);
......@@ -184,6 +213,39 @@ public class FTXTextureView extends TextureView implements TextureView.SurfaceTe
@Override
public void destroyRender() {
mRender.stopRender();
removeAllViewObserver();
}
@Override
public void addViewObserver(CarrierViewObserver observer) {
if (null != observer) {
mViewObservers.add(new WeakReference<>(observer));
}
}
@Override
public void removeViewObserver(CarrierViewObserver observer) {
int removeIndex = -1;
for (int i = 0; i < mViewObservers.size(); i++) {
WeakReference<CarrierViewObserver> observerWeakReference = mViewObservers.get(i);
if (observerWeakReference.get() == observer) {
removeIndex = i;
break;
}
}
if (removeIndex >= 0) {
mViewObservers.remove(removeIndex);
}
}
@Override
public void removeAllViewObserver() {
mViewObservers.clear();
}
@Override
public List<WeakReference<CarrierViewObserver>> getViewObservers() {
return mViewObservers;
}
@Override
......
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
......
......@@ -119,7 +119,7 @@ class _DemoSuperPlayerState extends State<DemoSuperPlayer> with TXPipPlayerResto
package: PlayerConstants.PKG_NAME)),
))
],
),
),
body: SafeArea(
left: !_isFullScreen,
top: !_isFullScreen,
......@@ -204,7 +204,7 @@ class _DemoSuperPlayerState extends State<DemoSuperPlayer> with TXPipPlayerResto
Widget _getPlayArea() {
return Container(
decoration: BoxDecoration(color: Colors.black),
height: playerHeight,
height: _isFullScreen ? MediaQuery.of(context).size.height : playerHeight,
child: SuperPlayerView(_controller, renderMode: renderMode,),
);
}
......
......@@ -48,7 +48,6 @@ class _DemoTXVodPlayerState extends State<DemoTXVodPlayer> with WidgetsBindingOb
});
LogUtils.logOpen = true;
playEventSubscription = _controller.onPlayerEventBroadcast.listen((event) async {
// Subscribe to event distribution
final int code = event["event"];
......
......@@ -34,8 +34,8 @@ class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
initPlatformState();
initPlayerLicense();
initPlatformState();
_getFlutterSdkVersion();
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
LogUtils.logOpen = true;
......@@ -49,6 +49,7 @@ class _MyAppState extends State<MyApp> {
isLicenseSuc.complete(true);
}
});
await SuperPlayerPlugin.setGlobalLicense(LICENSE_URL, LICENSE_KEY);
retryConfigLicense();
// enable flexible license valid
SuperPlayerPlugin.setLicenseFlexibleValid(true);
......
......@@ -404,6 +404,10 @@ SuperPlayerPlugin* instance;
// only for android
}
- (void)setDrmProvisionEnvEnv:(NSInteger)env error:(FlutterError * _Nullable __autoreleasing *)error {
// only for android
}
#pragma mark DataBridge
- (NSMutableDictionary *)getPlayers {
......
......@@ -464,6 +464,7 @@ NSObject<FlutterMessageCodec> *nullGetFtxMessagesCodec(void);
- (nullable BoolMsg *)startVideoOrientationServiceWithError:(FlutterError *_Nullable *_Nonnull)error;
- (void)setUserIdMsg:(StringMsg *)msg error:(FlutterError *_Nullable *_Nonnull)error;
- (void)setLicenseFlexibleValidMsg:(BoolMsg *)msg error:(FlutterError *_Nullable *_Nonnull)error;
- (void)setDrmProvisionEnvEnv:(NSInteger)env error:(FlutterError *_Nullable *_Nonnull)error;
@end
extern void SetUpTXFlutterSuperPlayerPluginAPI(id<FlutterBinaryMessenger> binaryMessenger, NSObject<TXFlutterSuperPlayerPluginAPI> *_Nullable api);
......
......@@ -1634,6 +1634,25 @@ void SetUpTXFlutterSuperPlayerPluginAPIWithSuffix(id<FlutterBinaryMessenger> bin
[channel setMessageHandler:nil];
}
}
{
FlutterBasicMessageChannel *channel =
[[FlutterBasicMessageChannel alloc]
initWithName:[NSString stringWithFormat:@"%@%@", @"dev.flutter.pigeon.super_player.TXFlutterSuperPlayerPluginAPI.setDrmProvisionEnv", messageChannelSuffix]
binaryMessenger:binaryMessenger
codec:nullGetFtxMessagesCodec()];
if (api) {
NSCAssert([api respondsToSelector:@selector(setDrmProvisionEnvEnv:error:)], @"TXFlutterSuperPlayerPluginAPI api (%@) doesn't respond to @selector(setDrmProvisionEnvEnv:error:)", api);
[channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
NSArray<id> *args = message;
NSInteger arg_env = [GetNullableObjectAtIndex(args, 0) integerValue];
FlutterError *error;
[api setDrmProvisionEnvEnv:arg_env error:&error];
callback(wrapResult(nil, error));
}];
} else {
[channel setMessageHandler:nil];
}
}
}
void SetUpTXFlutterNativeAPI(id<FlutterBinaryMessenger> binaryMessenger, NSObject<TXFlutterNativeAPI> *api) {
SetUpTXFlutterNativeAPIWithSuffix(binaryMessenger, api, @"");
......
......@@ -4,7 +4,7 @@
#
Pod::Spec.new do |s|
s.name = 'super_player'
s.version = '12.5.0'
s.version = '12.5.1'
s.summary = 'The super_player Flutter plugin is one of the sub-product SDKs of the audio/video terminal SDK (Tencent Cloud Video on Demand).'
s.description = <<-DESC
player plugin.
......@@ -26,7 +26,7 @@ player plugin.
# Player_Premium SDK: s.dependency 'TXLiteAVSDK_Player_Premium'
# Professional SDK: s.dependency 'TXLiteAVSDK_Professional'
# If you want to specify the SDK version(eg 11.6.15041), use: s.dependency 'TXLiteAVSDK_Player','11.6.15041'
s.dependency 'TXLiteAVSDK_Player','12.5.18359'
s.dependency 'TXLiteAVSDK_Player','12.5.18393'
# s.dependency 'FTXPiPKit'
s.vendored_frameworks = [
'localdep/FTXPiPKit.xcframework'
......
......@@ -2,5 +2,5 @@
part of SuperPlayer;
abstract class FPlayerPckInfo {
static const String PLAYER_VERSION = "12.5.0";
static const String PLAYER_VERSION = "12.5.1";
}
\ No newline at end of file
......@@ -398,6 +398,8 @@ abstract class TXFlutterSuperPlayerPluginAPI {
void setUserId(StringMsg msg);
void setLicenseFlexibleValid(BoolMsg msg);
void setDrmProvisionEnv(int env);
}
@HostApi()
......
......@@ -299,6 +299,15 @@ class SuperPlayerPlugin implements TXPluginFlutterAPI, TXPipFlutterAPI {
await _playerPluginApi.setLicenseFlexibleValid(BoolMsg(value: enabled));
}
///
/// 设置 Drm 证书提供商环境,参考 [TXDrmProvisionEnv]
///
/// Set the DRM certificate provider environment. See [TXDrmProvisionEnv].
///
static Future<void> setDrmProvisionEnv(TXDrmProvisionEnv env) async {
await _playerPluginApi.setDrmProvisionEnv(env.index);
}
@override
void onPipEvent(Map<dynamic, dynamic> event) {
LogUtils.d(TAG, "[pipEventHandler], receive event = $event ");
......
......@@ -544,6 +544,15 @@ enum TXPlayerLiveMode {
Smooth
}
enum TXDrmProvisionEnv {
// 代表使用 google COM 域名证书提供商
// using the Google COM domain certificate provider
DRM_PROVISION_ENV_COM,
// 代表使用 google CN 域名证书提供商
// using the Google CN domain certificate provider
DRM_PROVISION_ENV_CN
}
enum TXPlayerState {
// Playback paused.
// 暂停播放
......
......@@ -1661,6 +1661,28 @@ class TXFlutterSuperPlayerPluginAPI {
return;
}
}
Future<void> setDrmProvisionEnv(int env) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.super_player.TXFlutterSuperPlayerPluginAPI.setDrmProvisionEnv$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_channel.send(<Object?>[env]) as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else {
return;
}
}
}
class TXFlutterNativeAPI {
......
name: super_player
description: The super_player Flutter plugin is one of the sub-product SDKs of the audio/video terminal SDK (Tencent Cloud Video on Demand).
version: 12.5.0
version: 12.5.1
homepage: https://github.com/LiteAVSDK/Player_Flutter
environment:
......@@ -11,12 +11,10 @@ dependencies:
flutter:
sdk: flutter
synchronized: ^3.0.0+3
flutter_localizations:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
# pigeon: ^22.6.0
pigeon: ^22.6.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
......
......@@ -3,5 +3,5 @@ part of demo_super_player_lib;
class PlayerConstants {
static const PKG_NAME = "superplayer_widget";
static const String PLAYER_WIDGET_VERSION = "12.5.0";
static const String PLAYER_WIDGET_VERSION = "12.5.1";
}
......@@ -9,7 +9,7 @@ typedef TaskDetailFunc = Future Function();
class TaskExecutors {
bool _isTaskRunning = false;
final LinkedList<TaskItem> _taskList = LinkedList<TaskItem>();
final List<TaskItem> _taskList = [];
Future addTask(TaskDetailFunc task) {
Completer completer = Completer();
......@@ -42,7 +42,7 @@ class TaskExecutors {
}
}
class TaskItem extends LinkedListEntry<TaskItem> {
class TaskItem {
TaskDetailFunc function;
TaskCallback taskCallback;
......
......@@ -915,25 +915,25 @@ class FullScreenController {
FullScreenController();
void switchToOrientation(int orientationDirection) {
Future<void> switchToOrientation(int orientationDirection) async {
if (currentOrientation != orientationDirection) {
forceSwitchOrientation(orientationDirection);
}
}
void forceSwitchOrientation(int orientationDirection) async {
Future<void> forceSwitchOrientation(int orientationDirection) async {
currentOrientation = orientationDirection;
if (orientationDirection == TXVodPlayEvent.ORIENTATION_PORTRAIT_UP) {
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values);
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
exitFullScreen();
} else if (orientationDirection == TXVodPlayEvent.ORIENTATION_LANDSCAPE_RIGHT) {
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.leanBack);
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
await SystemChrome.setPreferredOrientations(Platform.isIOS ? [DeviceOrientation.landscapeRight] : [DeviceOrientation.landscapeLeft]);
enterFullScreen();
} else if (orientationDirection == TXVodPlayEvent.ORIENTATION_PORTRAIT_DOWN) {
} else if (orientationDirection == TXVodPlayEvent.ORIENTATION_LANDSCAPE_LEFT) {
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.leanBack);
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
await SystemChrome.setPreferredOrientations(Platform.isIOS ? [DeviceOrientation.landscapeLeft] : [DeviceOrientation.landscapeRight]);
enterFullScreen();
}
......
......@@ -87,7 +87,7 @@ class _VideoBottomViewState extends State<VideoBottomView> {
fit: BoxFit.fill)),
padding: _showFullScreenBtn
? const EdgeInsets.only(left: 6, right: 6, bottom: 3)
: const EdgeInsets.only(left: 20, right: 20, bottom: 13),
: const EdgeInsets.only(left: 30, right: 30, bottom: 20),
child: Row(
children: [
_getPlayImage(),
......@@ -130,17 +130,17 @@ class _VideoBottomViewState extends State<VideoBottomView> {
}
Widget _getPlayImage() {
return InkWell(
return GestureDetector(
onTap: onTapStartOrPause,
child: _isPlayMode
? const Image(
width: 30,
height: 30,
width: 35,
height: 35,
image: AssetImage("images/superplayer_ic_vod_pause_normal.png", package: PlayerConstants.PKG_NAME),
)
: const Image(
width: 30,
height: 30,
width: 35,
height: 35,
image: AssetImage("images/superplayer_ic_vod_play_normal.png", package: PlayerConstants.PKG_NAME),
),
);
......
......@@ -67,7 +67,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
@override
void initState() {
super.initState();
// TXPipController.instance.exitAndReleaseCurrentPip();
TXPipController.instance.exitAndReleaseCurrentPip();
_playController = widget._controller;
_currentUIStatus = _playController._playerUIStatus;
_applyRenderMode();
......@@ -148,9 +148,8 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
_onResume();
}
}
// Do not rotate the screen in picture-in-picture mode.
if (eventCode == TXVodPlayEvent.EVENT_ORIENTATION_CHANGED && _currentUIStatus != SuperPlayerUIStatus.PIP_MODE) {
else if (eventCode == TXVodPlayEvent.EVENT_ORIENTATION_CHANGED && _currentUIStatus != SuperPlayerUIStatus.PIP_MODE) {
int orientation = event[TXVodPlayEvent.EXTRA_NAME_ORIENTATION];
_playController.fullScreenController.switchToOrientation(orientation);
}
......@@ -291,20 +290,23 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
_currentUIStatus = SuperPlayerUIStatus.FULLSCREEN_MODE;
});
if (_playController.playerType != SuperPlayerType.VOD) {
WidgetsBinding.instance.addPostFrameCallback((a) async {
Future.delayed(Duration(milliseconds: 180), () async {
// reset render mode for live
await _playController.setPlayerView(-1);
await connectPlayerView();
});
}
}, () async {
_playController._updatePlayerUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
_videoBottomKey.currentState?.updateUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
_videoTitleKey.currentState?.updateUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
hideControlView();
// exit full screen
setState(() {
_currentUIStatus = SuperPlayerUIStatus.WINDOW_MODE;
});
_restoreToWindowMode();
if (_playController.playerType != SuperPlayerType.VOD) {
WidgetsBinding.instance.addPostFrameCallback((a) async {
Future.delayed(Duration(milliseconds: 180), () async {
// reset render mode for live
await _playController.setPlayerView(-1);
await connectPlayerView();
......@@ -384,13 +386,6 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
}
}
void _restoreToWindowMode() {
_playController._updatePlayerUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
_videoBottomKey.currentState?.updateUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
_videoTitleKey.currentState?.updateUIStatus(SuperPlayerUIStatus.WINDOW_MODE);
hideControlView();
}
void _refreshDownloadStatus() async {
_isDownloaded = await _playController.isDownloaded();
}
......@@ -586,11 +581,9 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
}
Widget _getPlayer() {
return InkWell(
return GestureDetector(
onDoubleTap: _onDoubleTapVideo,
onTap: _onSingleTapVideo,
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
child: Container(
decoration: BoxDecoration(color: Colors.black),
child: TXPlayerVideo(viewKey: _videoKey, onRenderViewCreatedListener: _onPlayerViewCreated,),
......@@ -782,7 +775,7 @@ class SuperPlayerViewState extends State<SuperPlayerView> with WidgetsBindingObs
}
if (_currentUIStatus == SuperPlayerUIStatus.FULLSCREEN_MODE) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.leanBack);
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
}
// Hide moreView
if (needHideMenuView) {
......
name: superplayer_widget
description: superplayer,base on vodplayer
version: 12.5.0
version: 12.5.1
environment:
sdk: '>=2.17.0 <4.0.0'
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论