第一步:准备好,穿山甲的gromore广告的appid,广告ID(注:广告ID和代码位ID要区分好),参考下图

第二步:引入sdk
在build.gradle项目中
repositories {
google()
jcenter()
mavenCentral()
maven {
url 'https://artifact.bytedance.com/repository/pangle'
}
}
allprojects {
repositories {
google()
jcenter()
maven {url "https://jitpack.io"}
mavenCentral()
maven {
url 'https://artifact.bytedance.com/repository/pangle'
}
}
}
在app的build.gradle中引入sdk
//GroMore_sdk
implementation "com.gromore.cn:gromore-sdk:4.0.0.1" //groMore sdk
implementation "com.gromore.cn:pangle-adapter:5.1.0.2.0" //穿山甲 adapter
implementation "com.gromore.cn:ks-adapter:3.3.38.0" //快手 adapter 这个根据自己需求添加
implementation "com.gromore.cn:gdt-adapter:4.510.1380.0" //优量汇 adapter 这个根据自己需求添加
第三步:权限和filePath添加
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--摄像机权限-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 悬浮窗 -->
<!--手机震动权限-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--读取本地图片权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<permission
android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN" /> <!-- 可选权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.GET_TASKS" /> <!-- 可选,穿山甲提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告 -->
<!-- 请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如果视频广告使用textureView播放,请务必添加,否则黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 穿山甲3400版本新增:建议添加“query_all_package”权限,穿山甲将通过此权限在Android R系统上判定广告对应的应用是否在用户的app上安装,避免投放错误的广告,以此提高用户的广告体验。若添加此权限,需要在您的用户隐私文档中声明! -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
//下面根据自己需求添加,参考穿山甲,让全球APP更有价值
<!-- Pangle start================== -->
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/pangle_file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
<!-- Pangle end================== -->
第四步:初始化sdk
官方提供的初始化必须在appliaction中,但是上架会有隐私政策不过
我测试了可以在引导页oncerate()中初始化,我的项目是有个开屏广告的,我就是在开屏广告中初始化的
//MSDK的初始化需要放在Application中进行
GMAdManagerHolder.init(this);
第五步:加载激励视频
public class RewardVideoActivity2 extends BaseActivity{
private String TAG="Reward";
private AdRewardManager mAdRewardManager; //激励视频管理类
private boolean mLoadSuccess; //是否加载成功
private boolean mIsLoadedAndShow;//广告加载成功并展示
private GMRewardedAdListener mGMRewardedAdListener;
@Override
public int setLayout() {
return R.layout.activity_rewardvideo;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
GMMediationAdSdk.requestPermissionIfNecessary(this);
initListener();
initAdLoader();
}
private void initAdLoader() {
Log.e(TAG, "initAdLoader");
if (GMMediationAdSdk.configLoadSuccess()) {
Log.e("wangjj","GMMediationAdSdk加载成功");
}else {
Log.e("wangjj","GMMediationAdSdk加载失败");
}
mAdRewardManager = new AdRewardManager(this, new GMRewardedAdLoadCallback() {
@Override
public void onRewardVideoLoadFail(AdError adError) {
mLoadSuccess = false;
Log.e(TAG, "load RewardVideo ad error : " + adError.code + ", " + adError.message);
mAdRewardManager.printLoadFailAdnInfo();
}
@Override
public void onRewardVideoAdLoad() {
mLoadSuccess = true;
Log.e(TAG, "load RewardVideo ad success !");
// 获取本次waterfall加载中,加载失败的adn错误信息。
mAdRewardManager.printLoadAdInfo(); //打印已经加载广告的信息
mAdRewardManager.printLoadFailAdnInfo();//打印加载失败的adn错误信息
}
@Override
public void onRewardVideoCached() {
mLoadSuccess = true;
Log.e(TAG, "onRewardVideoCached....缓存成功");
Log.e(TAG,"激励视频素材缓存成功!");
showRewardAd();
}
});
mAdRewardManager.loadAdWithCallback("102285687", GMAdConstant.VERTICAL);
}
/**
* 展示广告
*/
private void showRewardAd() {
if (mLoadSuccess && mAdRewardManager != null) {
if (mAdRewardManager.getGMRewardAd() != null && mAdRewardManager.getGMRewardAd().isReady()) {
//在获取到广告后展示,强烈建议在onRewardVideoCached回调后,展示广告,提升播放体验
//该方法直接展示广告,如果展示失败了(如过期),会回调onVideoError()
//展示广告,并传入广告展示的场景
mAdRewardManager.getGMRewardAd().setRewardAdListener(mGMRewardedAdListener);
// mAdRewardManager.getGMRewardAd().setRewardPlayAgainListener(mGMRewardedPlayAgainListener);
mAdRewardManager.getGMRewardAd().showRewardAd(this);
mAdRewardManager.printSHowAdInfo();//打印已经展示的广告信息
mLoadSuccess = false;
} else {
Log.e(TAG,"当前广告不满足show的条件");
}
} else {
Log.e(TAG,"请先加载广告");
}
}
private void initListener(){
mGMRewardedAdListener = new GMRewardedAdListener() {
/**
* 广告的展示回调 每个广告仅回调一次
*/
public void onRewardedAdShow() {
Log.e(TAG,"onRewardedAdShow");
}
/**
* show失败回调。如果show时发现无可用广告(比如广告过期或者isReady=false),会触发该回调。
* 开发者应该结合自己的广告加载、展示流程,在该回调里进行重新加载。
* @param adError showFail的具体原因
*/
@Override
public void onRewardedAdShowFail(AdError adError) {
if (adError == null) {
return;
}
Log.e(TAG,"onRewardedAdShowFail, errCode: " + adError.code + ", errMsg: " + adError.message);
// 开发者应该结合自己的广告加载、展示流程,在该回调里进行重新加载
}
/**
* 注意Admob的激励视频不会回调该方法
*/
@Override
public void onRewardClick() {
Log.e(TAG, "onRewardClick");
}
/**
* 广告关闭的回调
*/
public void onRewardedAdClosed() {
Log.e(TAG,"onRewardedAdClosed");
finish();
}
/**
* 视频播放完毕的回调 Admob广告不存在该回调
*/
public void onVideoComplete() {
Log.e(TAG,"onVideoComplete");
}
/**
* 1、视频播放失败的回调
*/
public void onVideoError() {
Log.e(TAG,"onVideoError");
}
/**
* 激励视频播放完毕,验证是否有效发放奖励的回调
*/
public void onRewardVerify(RewardItem rewardItem) {
Map<String, Object> customData = rewardItem.getCustomData();
if (customData != null) {
// 首先判断是否启用了GroMore的服务端验证
Boolean isGroMoreServerSideVerify = (Boolean) customData.get(RewardItem.KEY_IS_GROMORE_SERVER_SIDE_VERIFY);
if (isGroMoreServerSideVerify != null && isGroMoreServerSideVerify) {
// 开启了GroMore的服务端激励验证,这里可以获取GroMore的服务端激励验证信息
boolean isVerify = rewardItem.rewardVerify();
// 如果isVerify=false,则可以根据下面的错误码来判断为什么是false,
// 1、如果errorCode为40001/40002/50001/50002,则是因为请求异常导致,媒体可以根据自己的判断决定是否发放奖励。
// 2、否则,就是媒体服务端回传的验证结果是false,此时应该不发放奖励。
Integer reason = (Integer) customData.get(RewardItem.KEY_REASON);
if (reason != null) {
Log.e(TAG,"rewardItem,开发者服务器回传的reason,开发者不传时为空");
}
Integer errorCode = (Integer) customData.get(RewardItem.KEY_ERROR_CODE);
if (errorCode != null) {
String errorMsg = (String) customData.get(RewardItem.KEY_ERROR_MSG);
Log.e(TAG,"rewardItem, gromore服务端验证异常时的错误信息,未发生异常时为0或20000:errorCode:" + errorCode + ", errMsg: " + errorMsg);
}
String gromoreExtra = (String) customData.get(RewardItem.KEY_GROMORE_EXTRA);
Log.e(TAG,"rewardItem, 开发者通过AdSlot传入的extra信息,会透传给媒体的服务器。开发者不传时为空,extra:" + gromoreExtra);
String transId = (String) customData.get(RewardItem.KEY_TRANS_ID);
Log.e(TAG,"rewardItem, gromore服务端验证产生的transId,一次广告播放会产生的唯一的transid: " + transId);
} else {
Logger.e("获得奖励了");
getJiek();
// // 未开启GroMore的服务端激励验证,这里获取adn的激励验证信息
// String adnName = (String) customData.get(RewardItem.KEY_ADN_NAME);
// if (!TextUtils.isEmpty(adnName)) {
// switch (adnName) {
// case RewardItem.KEY_GDT:
// Log.e(TAG,"rewardItem gdt: " + customData.get(RewardItem.KEY_GDT_TRANS_ID));
// break;
// }
// }
}
}
Log.e(TAG,"onRewardVerify");
}
/**
* - Mintegral GDT Admob广告不存在该回调
*/
@Override
public void onSkippedVideo() {
}
};
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mAdRewardManager != null) {
mAdRewardManager.destroy();
}
}
}
相关类
**
* 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用
*/
public class GMAdManagerHolder {
private static boolean sInit=false;
public static void init(Context context) {
doInit(context);
}
//step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
private static void doInit(@NonNull Context context) {
// if (!sInit) {
GMMediationAdSdk.initialize(context, buildV2Config(context));
sInit = true;
// }
}
public static GMAdConfig buildV2Config(Context context) {
/**
* GMConfigUserInfoForSegment设置流量分组的信息
* 注意:
* 1、请每次都传入新的info对象
* 2、字符串类型的值只能是大小写字母,数字,下划线,连字符,字符个数100以内 ( [A-Za-z0-9-_]{1,100} ) ,不符合规则的信息将被过滤掉,不起作用。
*/
GMConfigUserInfoForSegment userInfo = new GMConfigUserInfoForSegment();
userInfo.setUserId("msdk-demo");
userInfo.setGender(UserInfoForSegment.GENDER_MALE);
userInfo.setChannel("msdk-channel");
userInfo.setSubChannel("msdk-sub-channel");
userInfo.setAge(999);
userInfo.setUserValueGroup("msdk-demo-user-value-group");
Map<String, String> customInfos = new HashMap<>();
customInfos.put("aaaa", "test111");
customInfos.put("bbbb", "test222");
userInfo.setCustomInfos(customInfos);
JSONObject jsonObject = null;
//读取json文件,本地缓存的配置
// try {
// jsonObject = new JSONObject(getJson("androidlocalconfig.json", context));
// } catch (JSONException e) {
// e.printStackTrace();
// }
Map<String, Object> initConfig = new HashMap<>();
initConfig.put("1111", "22222");
initConfig.put("22222", "33333");
initConfig.put("44444", "5555");
return new GMAdConfig.Builder()
.setAppId("appID")
.setAppName("app名称")
.setDebug(true)
.setPublisherDid(getAndroidId(context))
.setOpenAdnTest(false)
.setConfigUserInfoForSegment(userInfo)
.setPangleOption(new GMPangleOption.Builder()
.setIsPaid(false)
.setTitleBarTheme(GMAdConstant.TITLE_BAR_THEME_DARK)
.setAllowShowNotify(true)
.setAllowShowPageWhenScreenLock(true)
.setDirectDownloadNetworkType(GMAdConstant.NETWORK_STATE_WIFI, GMAdConstant.NETWORK_STATE_3G)
.setIsUseTextureView(true)
.setNeedClearTaskReset()
.setKeywords("")
.build())
.setGdtOption(new GMGdtOption.Builder()
.setWxInstalled(false)
.setOpensdkVer(null)
.setSupportH265(false)
.setSupportSplashZoomout(false)
.build())
/**
* 隐私协议设置,详见GMPrivacyConfig
*/
.setPrivacyConfig(new GMPrivacyConfig() {
// 重写相应的函数,设置需要设置的权限开关,不重写的将采用默认值
// 例如,重写isCanUsePhoneState函数返回true,表示允许使用ReadPhoneState权限。
@Override
public boolean isCanUsePhoneState() {
return true;
}
//当isCanUseWifiState=false时,可传入Mac地址信息,穿山甲sdk使用您传入的Mac地址信息
@Override
public String getMacAddress() {
return "";
}
// 设置青少年合规,默认值GMAdConstant.ADULT_STATE.AGE_ADULT为成年人
@Override
public GMAdConstant.ADULT_STATE getAgeGroup() {
return GMAdConstant.ADULT_STATE.AGE_ADULT;
}
})
.setLocalExtra(initConfig)
.setCustomLocalConfig(jsonObject)
.build();
}
public static String getAndroidId(Context context) {
String androidId = null;
try {
androidId = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
} catch (Exception e) {
e.printStackTrace();
}
return androidId;
}
public static String getJson(String fileName, Context context) {
StringBuilder stringBuilder = new StringBuilder();
try {
InputStream is = context.getAssets().open(fileName);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}
/**
* 激励管理类。
* 只需要复制粘贴到项目中,通过回调处理相应的业务逻辑即可使用完成广告加载&展示
*/
public class AdRewardManager {
private static final String TAG = "AdRewardManager";
/**
* 激励对应的广告对象
* 每次加载全屏视频广告的时候需要新建一个GMRewardAd,否则可能会出现广告填充问题
*/
private GMRewardAd mGMRewardAd;
private Activity mActivity;
/**
* 激励加载广告回调
* 请在加载广告成功后展示广告
*/
private GMRewardedAdLoadCallback mGMRewardedAdLoadCallback;
/**
* GMAdConstant.HORIZONTAL 或 GMAdConstant.VERTICAL
*/
private int mOrientation; //方向
private String mAdUnitId; //广告位
/**
* ------------------------- 以下是必要实现,如果不实现会导致加载广告失败 --------------------------------------
*/
/**
* 管理类构造函数
* @param activity 激励展示的Activity
* @param rewardedAdLoadCallback 激励加载广告回调
*/
public AdRewardManager(Activity activity, GMRewardedAdLoadCallback rewardedAdLoadCallback) {
mActivity = activity;
mGMRewardedAdLoadCallback = rewardedAdLoadCallback;
}
/**
* 获取激励广告对象
*/
public GMRewardAd getGMRewardAd() {
return mGMRewardAd;
}
/**
* 加载激励广告,如果没有config配置会等到加载完config配置后才去请求广告
* @param adUnitId 广告位ID
* @param orientation 方向
*/
public void loadAdWithCallback(final String adUnitId, final int orientation) {
this.mOrientation = orientation;
this.mAdUnitId = adUnitId;
if (GMMediationAdSdk.configLoadSuccess()) {
Log.e("wangjj","GMMediationAdSdk加载成功");
loadAd(adUnitId, orientation);
} else {
Log.e("wangjj","GMMediationAdSdk加载失败");
GMMediationAdSdk.registerConfigCallback(mSettingConfigCallback);
}
}
/**
* 加载激励广告,如果没有config配置会等到加载完config配置后才去请求广告
* @param adUnitId 广告位ID
* @param orientation 方向
*/
private void loadAd(String adUnitId, int orientation) {
mGMRewardAd = new GMRewardAd(mActivity, adUnitId);
/**
* 激励视频服务端验证,GroMore会把设置的字符串透传给相应的ADN
*/
Map<String, String> customData = new HashMap<>();
customData.put(GMAdConstant.CUSTOM_DATA_KEY_PANGLE, "pangle media_extra");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_GDT, "gdt custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_KS, "ks custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_SIGMOB, "sigmob custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_MINTEGRAL, "mintegral custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_BAIDU, "baidu custom data");
// 如果开启了gromre服务端激励验证,可以传以下信息,跟adn无关。
customData.put(GMAdConstant.CUSTOM_DATA_KEY_GROMORE_EXTRA, "gromore serverside verify extra data"); // 会透传给媒体的服务器
/**
* 创建激励广告请求类型参数GMAdSlotRewardVideo,具体参数含义参考文档
*/
GMAdSlotRewardVideo adSlotRewardVideo = new GMAdSlotRewardVideo.Builder()
.setMuted(true)//对所有SDK的激励广告生效,除需要在平台配置的SDK,如穿山甲SDK
.setVolume(0f)//配合Admob的声音大小设置[0-1]
.setGMAdSlotGDTOption(GMAdOptionUtil.getGMAdSlotGDTOption().build())
.setGMAdSlotBaiduOption(GMAdOptionUtil.getGMAdSlotBaiduOption().build())
.setCustomData(customData)
.setRewardName("金币") //奖励的名称
.setRewardAmount(3) //奖励的数量
.setUserID("用户ID")//用户id,必传参数
.setUseSurfaceView(false) // 是否使用SurfaceView绘制,默认false。目前仅针对百度生效,建议使用false,否则百度会黑屏。
.setOrientation(orientation)//必填参数,期望视频的播放方向:GMAdConstant.HORIZONTAL 或 GMAdConstant.VERTICAL
.setBidNotify(true)//开启bidding比价结果通知,默认值为false
.build();
mGMRewardAd.loadAd(adSlotRewardVideo, mGMRewardedAdLoadCallback);
}
/**
* 在Activity onDestroy中需要调用清理资源
*/
public void destroy() {
if (mGMRewardAd != null) {
mGMRewardAd.destroy();
}
mActivity = null;
mGMRewardedAdLoadCallback = null;
GMMediationAdSdk.unregisterConfigCallback(mSettingConfigCallback); //注销config回调
}
/**
* config配置回调
*/
private GMSettingConfigCallback mSettingConfigCallback = new GMSettingConfigCallback() {
@Override
public void configLoad() {
loadAd(mAdUnitId, mOrientation);
}
};
/**
* ------------------------- 以下是非必要功能请选择性使用 --------------------------------------
*/
/**
* 展示广告加载信息
*/
public void printLoadAdInfo() {
if (mGMRewardAd == null) {
return;
}
}
/**
* 打印加载失败的adn错误信息
*/
public void printLoadFailAdnInfo() {
if (mGMRewardAd == null) {
return;
}
// 获取本次waterfall加载中,加载失败的adn错误信息。
Log.d(TAG, "reward ad loadinfos: " + mGMRewardAd.getAdLoadInfoList());
}
/**
* 打印已经展示的广告信息
*/
public void printSHowAdInfo() {
if (mGMRewardAd == null) {
return;
}
GMAdEcpmInfo gmAdEcpmInfo = mGMRewardAd.getShowEcpm();
if (gmAdEcpmInfo == null) {
return;
}
String s = App.getContext().getResources().getString(R.string.show_info,
gmAdEcpmInfo.getAdNetworkRitId(),
gmAdEcpmInfo.getAdnName(),
gmAdEcpmInfo.getPreEcpm());
Logger.e(TAG, s);
}
}
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url
目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一
一、什么是web项目ui自动化测试?通过测试工具模拟人为操控浏览器,使软件按照测试人员的预定计划自动执行测试的一种方式,可以完成许多手工测试无法完成或者不易实现的繁琐工作。正确使用自动化测试,可以更全面的对软件进行测试,从而提高软件质量进而缩短迭代周期。二、构建测试用例的“九部曲”(一)创建流程包划分功能模块日常测试活动中,都会根据功能模块进行拆分,所以在设计器中我们可以通过创建流程包的方式来拆分需要测试的功能模块,如下图中操作创建一个电脑流程包并且取名为对应的功能模块名称,如果有多个功能模块就创建多个对应的流程包,实在RPA设计器有易用的图形可视化界面,方便管理较多的功能模块。(二)在流程包
目录需求基于JavaCV跨平台执行ffmpeg命令[^1]坑一内存不足坑二多个ffmpeg进程并行导致IO负载大,进而导致ioerror?坑三使用Java操作ffmpeg时,有时会卡死坑四Process的waitFor死锁问题及解决办法需求给透明背景的视频自动叠加一张背景图片基于JavaCV跨平台执行ffmpeg命令1我测试发现的本需求的最小依赖:dependency>groupId>org.bytedecogroupId>artifactId>ffmpeg-platform-gplartifactId>version>5.0-1.5.7version>dependency>核心代码:Stri
摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信