Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
tx_player_fork
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蒋俊
tx_player_fork
Commits
d3359dfe
提交
d3359dfe
authored
11月 04, 2025
作者:
kongdywang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1. update to 12.9.0
2. Fix the issue where the live streaming player does not retain the last frame when playback stops. 3. Enable multi-bitrate by default for the player component. 4. Fix known issue
上级
86042c9a
隐藏空白字符变更
内嵌
并排
正在显示
19 个修改的文件
包含
63 行增加
和
94 行删除
+63
-94
CHANGELOG.md
Flutter/CHANGELOG.md
+10
-0
buildVersionOnMac.sh
Flutter/CI/buildVersionOnMac.sh
+1
-1
config.gradle
Flutter/android/config.gradle
+3
-2
FTXLivePlayer.java
...in/java/com/tencent/vod/flutter/player/FTXLivePlayer.java
+2
-0
FTXEGLRender.java
...om/tencent/vod/flutter/player/render/gl/FTXEGLRender.java
+8
-4
FTXTextureRender.java
...encent/vod/flutter/player/render/gl/FTXTextureRender.java
+17
-12
gradle.properties
Flutter/example/android/gradle.properties
+2
-1
demo_short_video_player.dart
Flutter/example/lib/demo_short_video_player.dart
+0
-2
demo_superplayer.dart
Flutter/example/lib/demo_superplayer.dart
+0
-2
demo_txLiveplayer.dart
Flutter/example/lib/demo_txLiveplayer.dart
+1
-2
demo_txvodplayer.dart
Flutter/example/lib/demo_txvodplayer.dart
+1
-2
short_video_page_widget.dart
Flutter/example/lib/shortvideo/short_video_page_widget.dart
+1
-1
FTXVodPlayer.m
Flutter/ios/Classes/player/FTXVodPlayer.m
+9
-58
super_player.podspec
Flutter/ios/super_player.podspec
+2
-2
common_config.dart
Flutter/lib/Core/common/common_config.dart
+2
-1
pubspec.yaml
Flutter/pubspec.yaml
+1
-1
player_constants.dart
...idget/superplayer_widget/lib/common/player_constants.dart
+1
-1
superplayer_controller.dart
...Widget/superplayer_widget/lib/superplayer_controller.dart
+1
-1
pubspec.yaml
FlutterWidget/superplayer_widget/pubspec.yaml
+1
-1
没有找到文件。
Flutter/CHANGELOG.md
浏览文件 @
d3359dfe
#### Version: 12.9.0 2025.11.13
##### Features:
-
set Android TXLiteAVSDK to 12.9.0.19467
-
set iOS TXLiteAVSDK to 12.9.20063
-
Fix the issue where the live streaming player does not retain the last frame when playback stops.
-
Enable multi-bitrate by default for the player component.
-
Fix known issue
#### Version: 12.8.1 2025.10.23
...
...
Flutter/CI/buildVersionOnMac.sh
浏览文件 @
d3359dfe
...
...
@@ -5,7 +5,7 @@ buildLog() {
}
inputVersion
=
$1
export
VERSION_NAME
=
"12.
8.1
"
export
VERSION_NAME
=
"12.
9.0
"
if
[
-n
"
$inputVersion
"
]
;
then
VERSION_NAME
=
$inputVersion
fi
...
...
Flutter/android/config.gradle
浏览文件 @
d3359dfe
...
...
@@ -4,7 +4,7 @@ rootProject.ext {
supportSdkVersion
=
"26.0.1"
minSdkVersion
=
19
targetSdkVersion
=
28
playerVersion
=
"12.
8.1
"
playerVersion
=
"12.
9.0
"
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.
8.0.19279
"
liteavSdk
=
"com.tencent.liteav:LiteAVSDK_Player:12.
9.0.19467
"
}
\ No newline at end of file
Flutter/android/src/main/java/com/tencent/vod/flutter/player/FTXLivePlayer.java
浏览文件 @
d3359dfe
...
...
@@ -182,6 +182,8 @@ public class FTXLivePlayer extends FTXLivePlayerRenderHost implements TXFlutterL
if
(
mLivePlayer
!=
null
)
{
mLastPlayEvent
=
-
1
;
mIsPaused
=
false
;
mLivePlayer
.
setProperty
(
V2TXLiveProperty
.
kV2ClearLastImage
,
isNeedClearLastImg
);
result
=
mLivePlayer
.
stopPlay
();
}
mUIHandler
.
removeCallbacksAndMessages
(
null
);
...
...
Flutter/android/src/main/java/com/tencent/vod/flutter/player/render/gl/FTXEGLRender.java
浏览文件 @
d3359dfe
...
...
@@ -248,7 +248,7 @@ public class FTXEGLRender implements SurfaceTexture.OnFrameAvailableListener {
mEGLContextEncoder
=
EGL14
.
eglCreateContext
(
mEGLDisplay
,
eglConfigs
[
0
],
EGL14
.
EGL_NO_CONTEXT
,
attrib_list
,
0
);
checkEglError
(
"eglCreateContext"
);
checkEglError
(
"eglCreateContext"
,
false
);
if
(
mEGLContextEncoder
==
EGL14
.
EGL_NO_CONTEXT
)
{
LiteavLog
.
e
(
TAG
,
"null context2"
);
return
false
;
...
...
@@ -259,7 +259,7 @@ public class FTXEGLRender implements SurfaceTexture.OnFrameAvailableListener {
};
mEGLSurfaceEncoder
=
EGL14
.
eglCreateWindowSurface
(
mEGLDisplay
,
eglConfigs
[
0
],
surface
,
surfaceAttribs2
,
0
);
//creates an EGL window surface and returns its handle
checkEglError
(
"eglCreateWindowSurface"
);
checkEglError
(
"eglCreateWindowSurface"
,
false
);
if
(
mEGLSurfaceEncoder
==
EGL14
.
EGL_NO_SURFACE
)
{
LiteavLog
.
e
(
TAG
,
"surface was null"
);
...
...
@@ -270,11 +270,15 @@ public class FTXEGLRender implements SurfaceTexture.OnFrameAvailableListener {
}
private
boolean
checkEglError
(
String
msg
)
{
return
checkEglError
(
msg
,
true
);
}
private
boolean
checkEglError
(
String
msg
,
boolean
needPrintMsg
)
{
int
error
=
0
;
if
((
error
=
EGL14
.
eglGetError
())
!=
EGL14
.
EGL_SUCCESS
)
{
LiteavLog
.
e
(
TAG
,
"checkEglError: "
+
msg
+
"error: "
+
error
);
return
false
;
}
else
{
}
else
if
(
needPrintMsg
)
{
LiteavLog
.
e
(
TAG
,
msg
);
}
...
...
@@ -298,7 +302,7 @@ public class FTXEGLRender implements SurfaceTexture.OnFrameAvailableListener {
public
boolean
swapBuffers
()
{
boolean
result
=
EGL14
.
eglSwapBuffers
(
mEGLDisplay
,
mEGLSurfaceEncoder
);
checkEglError
(
"eglSwapBuffers"
);
checkEglError
(
"eglSwapBuffers"
,
false
);
return
result
;
}
...
...
Flutter/android/src/main/java/com/tencent/vod/flutter/player/render/gl/FTXTextureRender.java
浏览文件 @
d3359dfe
...
...
@@ -44,15 +44,21 @@ public class FTXTextureRender {
"}\n"
;
private
static
final
String
VIDEO_FRAGMENT_SHADER
=
"#version 300 es\n"
+
"#extension GL_OES_EGL_image_external_essl3 : require\n"
+
"precision mediump float;\n"
+
"uniform samplerExternalOES sTexture;\n"
+
"in vec2 vTextureCoord;\n"
+
"out vec4 outColor;\n"
+
"void main() {\n"
+
" outColor = texture(sTexture, vTextureCoord);\n"
+
"}"
;
"#version 300 es\n"
+
"#extension GL_OES_EGL_image_external_essl3 : require\n"
+
"precision mediump float;\n"
+
"uniform samplerExternalOES sTexture;\n"
+
"in vec2 vTextureCoord;\n"
+
"out vec4 outColor;\n"
+
"void main() {\n"
+
" vec2 safeCoord = vTextureCoord;\n"
+
" if (safeCoord.x > 0.99) {\n"
+
" safeCoord.x = 0.99;\n"
+
" }\n"
+
" safeCoord.x = clamp(safeCoord.x, 0.001, 0.999);\n"
+
" safeCoord.y = clamp(safeCoord.y, 0.001, 0.999);\n"
+
" outColor = texture(sTexture, safeCoord);\n"
+
"}\n"
;
private
final
float
[]
projectionMatrix
=
new
float
[
16
];
private
final
float
[]
rotationMatrix
=
new
float
[
16
];
...
...
@@ -113,9 +119,9 @@ public class FTXTextureRender {
GLES20
.
GL_TEXTURE_WRAP_S
,
GLES20
.
GL_CLAMP_TO_EDGE
);
GLES20
.
glTexParameteri
(
GLES11Ext
.
GL_TEXTURE_EXTERNAL_OES
,
GLES20
.
GL_TEXTURE_WRAP_T
,
GLES20
.
GL_CLAMP_TO_EDGE
);
GLES20
.
glTexParameter
i
(
GLES11Ext
.
GL_TEXTURE_EXTERNAL_OES
,
GLES20
.
glTexParameter
f
(
GLES11Ext
.
GL_TEXTURE_EXTERNAL_OES
,
GLES20
.
GL_TEXTURE_MIN_FILTER
,
GLES20
.
GL_LINEAR
);
GLES20
.
glTexParameter
i
(
GLES11Ext
.
GL_TEXTURE_EXTERNAL_OES
,
GLES20
.
glTexParameter
f
(
GLES11Ext
.
GL_TEXTURE_EXTERNAL_OES
,
GLES20
.
GL_TEXTURE_MAG_FILTER
,
GLES20
.
GL_LINEAR
);
return
tex
[
0
];
}
...
...
@@ -197,7 +203,6 @@ public class FTXTextureRender {
// reset
Matrix
.
setIdentityM
(
mResultMatrix
,
0
);
Matrix
.
multiplyMM
(
mResultMatrix
,
0
,
rotationMatrix
,
0
,
projectionMatrix
,
0
);
System
.
arraycopy
(
mResultMatrix
,
0
,
projectionMatrix
,
0
,
16
);
}
public
void
cleanDrawCache
()
{
...
...
Flutter/example/android/gradle.properties
浏览文件 @
d3359dfe
android.useAndroidX
=
true
android.enableJetifier
=
true
org.gradle.jvmargs
=
-Xmx4096m -
XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -
Dfile.encoding=UTF-8
org.gradle.jvmargs
=
-Xmx4096m -Dfile.encoding=UTF-8
\ No newline at end of file
Flutter/example/lib/demo_short_video_player.dart
浏览文件 @
d3359dfe
...
...
@@ -4,7 +4,6 @@ import 'package:flutter/cupertino.dart';
import
'package:flutter/material.dart'
;
import
'package:super_player/super_player.dart'
;
import
'package:superplayer_widget/demo_superplayer_lib.dart'
;
import
'common/demo_config.dart'
;
import
'shortvideo/demo_short_video_lib.dart'
;
class
DemoShortVideoPlayer
extends
StatefulWidget
{
...
...
@@ -28,7 +27,6 @@ class _DemoShortVideoPlayerState extends State<DemoShortVideoPlayer> with Widget
}
void
_loadData
()
async
{
// check license
final
ShortVideoDataLoader
loader
=
ShortVideoDataLoader
();
loader
.
getPageListDataOneByOneFunction
((
dataModels
)
{
setState
(()
{
...
...
Flutter/example/lib/demo_superplayer.dart
浏览文件 @
d3359dfe
...
...
@@ -10,8 +10,6 @@ import 'package:superplayer_widget/demo_superplayer_lib.dart';
import
'package:super_player_example/res/app_localizations.dart'
;
import
'dart:ui'
;
import
'common/demo_config.dart'
;
/// flutter superplayer demo
class
DemoSuperPlayer
extends
StatefulWidget
{
Map
?
initParams
=
{};
...
...
Flutter/example/lib/demo_txLiveplayer.dart
浏览文件 @
d3359dfe
...
...
@@ -10,7 +10,6 @@ import 'package:superplayer_widget/demo_superplayer_lib.dart';
import
'ui/demo_inputdialog.dart'
;
import
'ui/demo_volume_slider.dart'
;
import
'ui/demo_video_slider_view.dart'
;
import
'common/demo_config.dart'
;
class
DemoTXLivePlayer
extends
StatefulWidget
{
@override
...
...
@@ -171,7 +170,7 @@ class _DemoTXLivePlayerState extends State<DemoTXLivePlayer> with WidgetsBinding
_isPlaying
=
false
;
_controller
.
pause
();
}),
_createItem
(
AppLocals
.
current
.
playerStopPlay
,
()
{
_createItem
(
AppLocals
.
current
.
playerStopPlay
,
()
async
{
_isStop
=
true
;
_controller
.
stop
(
isNeedClear:
true
);
}),
...
...
Flutter/example/lib/demo_txvodplayer.dart
浏览文件 @
d3359dfe
...
...
@@ -8,7 +8,6 @@ import 'package:super_player/super_player.dart';
import
'package:super_player_example/res/app_localizations.dart'
;
import
'package:superplayer_widget/demo_superplayer_lib.dart'
;
import
'common/demo_config.dart'
;
import
'ui/demo_bitrate_checkbox.dart'
;
import
'ui/demo_inputdialog.dart'
;
import
'ui/demo_speed_slider.dart'
;
...
...
@@ -37,7 +36,7 @@ class _DemoTXVodPlayerState extends State<DemoTXVodPlayer> with WidgetsBindingOb
bool
_isPlaying
=
false
;
StreamSubscription
?
playEventSubscription
;
StreamSubscription
?
playNetEventSubscription
;
FTXAndroidRenderViewType
_renderType
=
FTXAndroidRenderViewType
.
TEXTUR
E_VIEW
;
FTXAndroidRenderViewType
_renderType
=
FTXAndroidRenderViewType
.
SURFAC
E_VIEW
;
FTXPlayerRenderMode
_renderMode
=
FTXPlayerRenderMode
.
ADJUST_RESOLUTION
;
GlobalKey
<
VideoSliderViewState
>
progressSliderKey
=
GlobalKey
();
...
...
Flutter/example/lib/shortvideo/short_video_page_widget.dart
浏览文件 @
d3359dfe
...
...
@@ -33,7 +33,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
}
_init
()
async
{
_controller
.
setConfig
(
FTXVodPlayConfig
());
await
_controller
.
setConfig
(
FTXVodPlayConfig
());
LogUtils
.
i
(
TAG
,
" [init]
${widget.position.toString()}
${this.hashCode.toString()}
${_controller.hashCode.toString()}
"
);
_setPlayerListener
();
...
...
Flutter/ios/Classes/player/FTXVodPlayer.m
浏览文件 @
d3359dfe
...
...
@@ -29,7 +29,6 @@ static const int uninitialized = -1;
@property
(
nonatomic
,
strong
)
TXVodPlayerFlutterAPI
*
vodFlutterApi
;
@property
(
nonatomic
,
strong
)
FTXRenderViewFactory
*
renderViewFactory
;
@property
(
nonatomic
,
strong
)
FTXRenderView
*
curRenderView
;
@property
(
nonatomic
,
strong
)
UIView
*
txPipView
;
@property
(
nonatomic
,
assign
)
NSUInteger
renderMode
;
@property
(
nonatomic
,
assign
)
float
cacheStartTime
;
...
...
@@ -124,7 +123,6 @@ static const int uninitialized = -1;
_txVodPlayer
=
nil
;
}
self
.
txPipView
=
nil
;
self
.
curRenderView
=
nil
;
self
.
cacheStartTime
=
0
;
...
...
@@ -631,53 +629,12 @@ static const int uninitialized = -1;
if
(
self
.
delegate
&&
[
self
.
delegate
respondsToSelector
:
@selector
(
onPlayerPipRequestStart
)])
{
[
self
.
delegate
onPlayerPipRequestStart
];
}
UIViewController
*
flutterVC
=
[
self
getFlutterViewController
];
[
flutterVC
.
view
addSubview
:
self
.
txPipView
];
[
_txVodPlayer
setupVideoWidget
:
self
.
txPipView
insertIndex
:
0
];
[
_txVodPlayer
enterPictureInPicture
];
return
NO_ERROR
;
}
-
(
UIView
*
)
txPipView
{
if
(
!
_txPipView
)
{
// Set the size to 1 pixel to ensure proper display in PIP.
_txPipView
=
[[
UIView
alloc
]
initWithFrame
:
CGRectMake
(
0
,
0
,
1
,
1
)];
_txPipView
.
hidden
=
YES
;
}
return
_txPipView
;
}
-
(
UIViewController
*
)
getFlutterViewController
{
UIWindow
*
window
=
nil
;
if
(
@available
(
iOS
13
.
0
,
*
))
{
NSSet
<
UIScene
*>
*
connectedScenes
=
[
UIApplication
sharedApplication
].
connectedScenes
;
for
(
UIScene
*
scene
in
connectedScenes
)
{
if
([
scene
isKindOfClass
:[
UIWindowScene
class
]])
{
UIWindowScene
*
windowScene
=
(
UIWindowScene
*
)
scene
;
for
(
UIWindow
*
w
in
windowScene
.
windows
)
{
if
(
w
.
isKeyWindow
)
{
window
=
w
;
break
;
}
}
if
(
window
!=
nil
)
{
break
;
}
}
}
}
else
{
for
(
UIWindow
*
w
in
[
UIApplication
sharedApplication
].
windows
)
{
if
(
w
.
isKeyWindow
)
{
window
=
w
;
break
;
}
}
}
return
window
.
rootViewController
;
}
#pragma mark - PIP delegate
-
(
void
)
onPlayer
:
(
TXVodPlayer
*
)
player
pictureInPictureStateDidChange
:
(
TX_VOD_PLAYER_PIP_STATE
)
pipState
withParam
:
(
NSDictionary
*
)
param
{
if
(
pipState
==
TX_VOD_PLAYER_PIP_STATE_DID_START
)
{
...
...
@@ -695,21 +652,15 @@ static const int uninitialized = -1;
if
(
pipState
==
TX_VOD_PLAYER_PIP_STATE_DID_STOP
)
{
self
.
hasEnteredPipMode
=
NO
;
if
(
self
.
restoreUI
)
{
self
.
restoreUI
=
NO
;
}
else
{
dispatch_async
(
dispatch_get_main_queue
(),
^
{
if
([
UIApplication
sharedApplication
].
applicationState
==
UIApplicationStateActive
)
{
[
player
exitPictureInPicture
];
}
[
self
->
_txPipView
removeFromSuperview
];
self
->
_txPipView
=
nil
;
dispatch_async
(
dispatch_get_main_queue
(),
^
{
if
([
UIApplication
sharedApplication
].
applicationState
==
UIApplicationStateActive
)
{
[
player
exitPictureInPicture
];
}
if
(
self
.
delegate
&&
[
self
.
delegate
respondsToSelector
:
@selector
(
onPlayerPipStateDidStop
)])
{
[
self
.
delegate
onPlayerPipStateDidStop
];
}
});
}
if
(
self
.
delegate
&&
[
self
.
delegate
respondsToSelector
:
@selector
(
onPlayerPipStateDidStop
)])
{
[
self
.
delegate
onPlayerPipStateDidStop
];
}
});
}
if
(
pipState
==
TX_VOD_PLAYER_PIP_STATE_RESTORE_UI
)
{
...
...
Flutter/ios/super_player.podspec
浏览文件 @
d3359dfe
...
...
@@ -4,7 +4,7 @@
#
Pod
::
Spec
.
new
do
|
s
|
s
.
name
=
'super_player'
s
.
version
=
'12.
8.1
'
s
.
version
=
'12.
9.0
'
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.
8.19666
'
s
.
dependency
'TXLiteAVSDK_Player'
,
'12.
9.20063
'
# s.dependency 'FTXPiPKit'
s
.
vendored_frameworks
=
[
'localdep/FTXPiPKit.xcframework'
...
...
Flutter/lib/Core/common/common_config.dart
浏览文件 @
d3359dfe
...
...
@@ -2,5 +2,5 @@
part of
SuperPlayer
;
abstract
class
FPlayerPckInfo
{
static
const
String
PLAYER_VERSION
=
"12.
8.1
"
;
static
const
String
PLAYER_VERSION
=
"12.
9.0
"
;
}
\ No newline at end of file
Flutter/pubspec.yaml
浏览文件 @
d3359dfe
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.
8.1
version
:
12.
9.0
homepage
:
https://github.com/LiteAVSDK/Player_Flutter
environment
:
...
...
FlutterWidget/superplayer_widget/lib/common/player_constants.dart
浏览文件 @
d3359dfe
...
...
@@ -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.
8.1
"
;
static
const
String
PLAYER_WIDGET_VERSION
=
"12.
9.0
"
;
}
FlutterWidget/superplayer_widget/lib/superplayer_controller.dart
浏览文件 @
d3359dfe
...
...
@@ -48,7 +48,7 @@ class SuperPlayerController {
bool
_needToResume
=
false
;
bool
_needToPause
=
false
;
bool
callResume
=
false
;
bool
_isMultiBitrateStream
=
fals
e
;
// the flag playing multi-bitrate URLs flag
bool
_isMultiBitrateStream
=
tru
e
;
// the flag playing multi-bitrate URLs flag
bool
_changeHWAcceleration
=
false
;
// the flag before receiving the first keyframe after switching to hardware decoding
bool
_isOpenHWAcceleration
=
true
;
int
_playerUIStatus
=
SuperPlayerUIStatus
.
WINDOW_MODE
;
...
...
FlutterWidget/superplayer_widget/pubspec.yaml
浏览文件 @
d3359dfe
name
:
superplayer_widget
description
:
superplayer,base on vodplayer
version
:
12.
8.1
version
:
12.
9.0
environment
:
sdk
:
'
>=2.17.0
<4.0.0'
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论