Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
tx_player_fork
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蒋俊
tx_player_fork
Commits
86800444
提交
86800444
authored
12月 08, 2022
作者:
kongdywang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix some pip bug & modify docs
上级
13fdf5b3
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
43 行增加
和
16 行删除
+43
-16
AndroidManifest.xml
Flutter/android/src/main/AndroidManifest.xml
+0
-2
集成指引.md
Flutter/docs/集成指引.md
+24
-3
short_video_page_widget.dart
Flutter/example/lib/shortvideo/short_video_page_widget.dart
+1
-1
txplayer_widget.dart
Flutter/lib/Core/txplayer_widget.dart
+1
-1
txpipplayer_data.dart
Flutter/superplayer_widget/lib/model/txpipplayer_data.dart
+1
-0
txpip_controller.dart
Flutter/superplayer_widget/lib/tools/txpip_controller.dart
+16
-9
没有找到文件。
Flutter/android/src/main/AndroidManifest.xml
浏览文件 @
86800444
...
@@ -3,8 +3,6 @@
...
@@ -3,8 +3,6 @@
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:tools=
"http://schemas.android.com/tools"
package=
"com.tencent.vod.flutter"
>
package=
"com.tencent.vod.flutter"
>
<!-- android:documentLaunchMode="intoExisting"-->
<!-- android:excludeFromRecents="true"-->
<application>
<application>
<activity
<activity
android:name=
"com.tencent.vod.flutter.ui.FlutterPipImplActivity"
android:name=
"com.tencent.vod.flutter.ui.FlutterPipImplActivity"
...
...
Flutter/docs/集成指引.md
浏览文件 @
86800444
...
@@ -151,7 +151,8 @@ SuperPlayerPlugin.setGlobalLicense(licenceURL, licenceKey);
...
@@ -151,7 +151,8 @@ SuperPlayerPlugin.setGlobalLicense(licenceURL, licenceKey);
## 常见问题
## 常见问题
1.
iOS端运行,出现
`No visible @interface for 'TXLivePlayer' declares the selector 'startLivePlay:type:'`
等类似找不到接口错误。
1.
iOS端运行,出现
`No visible @interface for 'TXLivePlayer' declares the selector 'startLivePlay:type:'`
等类似找不到接口错误。
**解决方法**
:
可以使用如下命令,更新IOS SDK:
可以使用如下命令,更新IOS SDK:
```
shell
```
shell
...
@@ -164,6 +165,7 @@ pod update
...
@@ -164,6 +165,7 @@ pod update
常见异常日志:
`java. lang.RuntimeException: Duplicate class com.tencent.liteav.TXLiteAVCode found in modules classes.jar`
常见异常日志:
`java. lang.RuntimeException: Duplicate class com.tencent.liteav.TXLiteAVCode found in modules classes.jar`
**解决方法**
:
此时需要集成flutter 播放器的 Professional 版本,让tencent_trtc_cloud 和 flutter 播放器共同依赖于同一个版的 LiteAVSDK_Professional。注意确保依赖的LiteAVSDK_Professional 的版本必须一样。
此时需要集成flutter 播放器的 Professional 版本,让tencent_trtc_cloud 和 flutter 播放器共同依赖于同一个版的 LiteAVSDK_Professional。注意确保依赖的LiteAVSDK_Professional 的版本必须一样。
如:依赖Android 端TXLiteAVSDK_Professional_10.3.0.11196 和 iOS 端TXLiteAVSDK_Professional to 10.3.12231 版本,依赖声明如下:
如:依赖Android 端TXLiteAVSDK_Professional_10.3.0.11196 和 iOS 端TXLiteAVSDK_Professional to 10.3.12231 版本,依赖声明如下:
...
@@ -179,19 +181,38 @@ pod update
...
@@ -179,19 +181,38 @@ pod update
```
```
3. 需要同时使用多个播放器实例的时候,频繁切换播放视频,画面呈现模糊。
3. 需要同时使用多个播放器实例的时候,频繁切换播放视频,画面呈现模糊。
**解决方法**:
在每个播放器组件容器销毁的时候,调用播放器的`dispose`方法,将播放器释放
在每个播放器组件容器销毁的时候,调用播放器的`dispose`方法,将播放器释放
4. 其余通用flutter依赖问题
4. 其余通用flutter依赖问题
**解决方法**:
- 执行`flutter doctor`命令检查运行环境,直到出现”No issues found!“。
- 执行`flutter doctor`命令检查运行环境,直到出现”No issues found!“。
- 执行`flutter pub get`确保所有依赖的组件都已更新成功。
- 执行`flutter pub get`确保所有依赖的组件都已更新成功。
5. 集成superPlayer之后,出现如下manifest错误:
```
text
Attribute application@label value=(super_player_example) from AndroidManifest.xml:9:9-45
is also present at
[
com.tencent.liteav:LiteAVSDK_Player:10.8.0.13065
]
AndroidManifest.xml:22:9-41 value=(@string/app_name).
Suggestion: add 'tools:replace="android:label"' to
<application>
element at AndroidManifest.xml:8:4-51:19 to override.
```
**解决方法**:由于播放器安卓SDK的AndroidManifest已经定义过label,而flutter新建项目之后,在安卓目录的AndroidManifest也会定义label,此处建议根据错误提示,进入您的安卓项目目录,在AndroidManifest的根节点`manifest`节点下增加` xmlns:tools="http://schemas.android.com/tools" `,并在application节点下增加`'tools:replace="android:label"'`。
6. 集成superPlayer之后,出现如下版本错误:
```
text
uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library
[
:super_player
]
```
**解决方法**
:目前播放器安卓SDK最小支持版本为android 19,flutter部分版本默认安卓最小支持版本为android 16。建议您将最小支持版本提高到android 19。具体修改方法为,进入您的安卓项目的主module下,一般为
`app`
目录,将该目录下的
`build.gradle`
中的
`minSdkVersion`
修改为19。
## 更多功能
## 更多功能
你可以通过运行项目中的example体验完整功能,
[
example运行指引
](
example运行指引.md
)
。
你可以通过运行项目中的example体验完整功能,
[
example运行指引
](
example运行指引.md
)
。
播放器SDK官网提供了iOS、Android和Web 端的Demo体验,
[
请点击这里
](
https://cloud.tencent.com/document/product/881/20204
)
。
播放器SDK官网提供了iOS、Android和Web 端的Demo体验,
[
请点击这里
](
https://cloud.tencent.com/document/product/881/20204
)
。
...
...
Flutter/example/lib/shortvideo/short_video_page_widget.dart
浏览文件 @
86800444
...
@@ -45,7 +45,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
...
@@ -45,7 +45,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
}
}
_init
()
async
{
_init
()
async
{
await
_controller
?
.
initialize
();
await
_controller
.
initialize
();
_controller
.
setConfig
(
FTXVodPlayConfig
());
_controller
.
setConfig
(
FTXVodPlayConfig
());
LogUtils
.
i
(
TAG
,
" [init]
${widget.position.toString()}
${this.hashCode.toString()}
${_controller.hashCode.toString()}
"
);
LogUtils
.
i
(
TAG
,
" [init]
${widget.position.toString()}
${this.hashCode.toString()}
${_controller.hashCode.toString()}
"
);
_setPlayerListener
();
_setPlayerListener
();
...
...
Flutter/lib/Core/txplayer_widget.dart
浏览文件 @
86800444
...
@@ -71,7 +71,7 @@ class TXPlayerVideoState extends State<TXPlayerVideo> {
...
@@ -71,7 +71,7 @@ class TXPlayerVideoState extends State<TXPlayerVideo> {
var
viewWidth
=
constrains
.
maxWidth
;
var
viewWidth
=
constrains
.
maxWidth
;
var
viewHeight
=
constrains
.
maxHeight
;
var
viewHeight
=
constrains
.
maxHeight
;
var
videoWidth
=
controller
.
resizeVideoWidth
!;
var
videoWidth
=
controller
.
resizeVideoWidth
!;
var
videoHeight
=
widget
.
controller
.
resizeVideoHeight
!;
var
videoHeight
=
controller
.
resizeVideoHeight
!;
double
left
=
controller
.
videoLeft
!
*
viewWidth
/
videoWidth
;
double
left
=
controller
.
videoLeft
!
*
viewWidth
/
videoWidth
;
double
top
=
controller
.
videoTop
!
*
viewHeight
/
videoHeight
;
double
top
=
controller
.
videoTop
!
*
viewHeight
/
videoHeight
;
...
...
Flutter/superplayer_widget/lib/model/txpipplayer_data.dart
浏览文件 @
86800444
...
@@ -6,6 +6,7 @@ class TXPipPlayerData {
...
@@ -6,6 +6,7 @@ class TXPipPlayerData {
/// 画中画播放器实例,同时只能存在一个
/// 画中画播放器实例,同时只能存在一个
final
TXPlayerController
_playerController
;
final
TXPlayerController
_playerController
;
int
playerMode
=
TXPlayerType
.
VOD_PLAY
;
int
playerMode
=
TXPlayerType
.
VOD_PLAY
;
bool
isEnterPip
=
false
;
TXPipPlayerData
(
this
.
_playerController
)
{
TXPipPlayerData
(
this
.
_playerController
)
{
playerMode
=
_playerController
is
TXVodPlayerController
?
TXPlayerType
.
VOD_PLAY
:
playerMode
=
TXPlayerType
.
LIVE_PLAY
;
playerMode
=
_playerController
is
TXVodPlayerController
?
TXPlayerType
.
VOD_PLAY
:
playerMode
=
TXPlayerType
.
LIVE_PLAY
;
...
...
Flutter/superplayer_widget/lib/tools/txpip_controller.dart
浏览文件 @
86800444
...
@@ -43,18 +43,22 @@ class TXPipController {
...
@@ -43,18 +43,22 @@ class TXPipController {
if
((
Platform
.
isIOS
&&
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_ENTER
)
||
if
((
Platform
.
isIOS
&&
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_ENTER
)
||
(
Platform
.
isAndroid
&&
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_REQUEST_START
))
{
(
Platform
.
isAndroid
&&
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_REQUEST_START
))
{
_onPipEnterListener
?.
onNeedSavePipPageState
(
_extParams
);
_onPipEnterListener
?.
onNeedSavePipPageState
(
_extParams
);
_playerData
?.
isEnterPip
=
true
;
Navigator
.
of
(
context
).
pop
();
Navigator
.
of
(
context
).
pop
();
}
else
if
((
Platform
.
isIOS
&&
eventCode
==
TXVodPlayEvent
.
EVENT_IOS_PIP_MODE_WILL_EXIT
)
}
else
if
((
Platform
.
isIOS
&&
eventCode
==
TXVodPlayEvent
.
EVENT_IOS_PIP_MODE_WILL_EXIT
)
||
||
(
Platform
.
isAndroid
&&
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_EXIT
))
{
(
Platform
.
isAndroid
&&
eventCode
==
TXVodPlayEvent
.
EVENT_PIP_MODE_ALREADY_EXIT
))
{
_playerData
?.
isEnterPip
=
false
;
await
exitAndReleaseCurrentPip
();
await
exitAndReleaseCurrentPip
();
}
else
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_IOS_PIP_MODE_RESTORE_UI
)
{
}
else
if
(
eventCode
==
TXVodPlayEvent
.
EVENT_IOS_PIP_MODE_RESTORE_UI
)
{
_extParams
[
ARGUMENT_PIP_START_TIME
]
=
event
[
"playTime"
];
_extParams
[
ARGUMENT_PIP_START_TIME
]
=
event
[
"playTime"
];
await
exitAndReleaseCurrentPip
();
await
exitAndReleaseCurrentPip
();
_onJumpToPipPlayer
?.
call
(
_extParams
);
_onJumpToPipPlayer
?.
call
(
_extParams
);
}
else
if
(
eventCode
<
0
)
{
}
else
if
(
eventCode
<
0
)
{
// pip enter failed
if
(
_playerData
!=
null
&&
_playerData
!.
isEnterPip
)
{
_pipEventSubscription
?.
cancel
();
exitAndReleaseCurrentPip
();
_playerData
=
null
;
}
else
{
_releasePlayerData
();
}
}
}
});
});
int
enterResult
=
await
_playerData
!.
_playerController
.
enterPictureInPictureMode
(
int
enterResult
=
await
_playerData
!.
_playerController
.
enterPictureInPictureMode
(
...
@@ -63,20 +67,23 @@ class TXPipController {
...
@@ -63,20 +67,23 @@ class TXPipController {
pauseIconForAndroid:
pauseIconForAndroid
,
pauseIconForAndroid:
pauseIconForAndroid
,
forwardIconForAndroid:
forwardIconForAndroid
);
forwardIconForAndroid:
forwardIconForAndroid
);
if
(
enterResult
!=
TXVodPlayEvent
.
NO_ERROR
)
{
if
(
enterResult
!=
TXVodPlayEvent
.
NO_ERROR
)
{
_playerData
=
null
;
_releasePlayerData
();
_pipEventSubscription
?.
cancel
();
}
}
return
enterResult
;
return
enterResult
;
}
}
Future
<
void
>
exitAndReleaseCurrentPip
()
async
{
Future
<
void
>
exitAndReleaseCurrentPip
()
async
{
if
(
null
!=
_playerData
&&
_playerData
?.
_playerController
!=
null
)
{
if
(
null
!=
_playerData
&&
_playerData
?.
_playerController
!=
null
)
{
if
(
Platform
.
isAndroid
)
{
if
(
Platform
.
isAndroid
)
{
await
_playerData
?.
_playerController
.
exitPictureInPictureMode
();
await
_playerData
?.
_playerController
.
exitPictureInPictureMode
();
}
}
await
_playerData
?.
_playerController
.
stop
();
await
_playerData
?.
_playerController
.
stop
();
_playerData
?.
_playerController
.
dispose
();
_playerData
?.
_playerController
.
dispose
();
}
}
_releasePlayerData
();
}
void
_releasePlayerData
()
{
_pipEventSubscription
?.
cancel
();
_pipEventSubscription
?.
cancel
();
_playerData
=
null
;
_playerData
=
null
;
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论