跳转到内容

视频转换为基于Kotlin Android应用云式GIF

图形交换格式为静态图像和动画图像工作GIF图像常用-常用GIFs-即多次循环运动许多人通过有效应用GIF自成网络名人

贝斯特2200娱乐云化平台强健云化端对端上传、存储、操作、优化和交付图像视频播放.以操作为特征, 通过重定位应用各种特效来转换视觉媒体

使用云化视频转换droid演示应用程序,用Kotlin写成GIF帮助性任务值得学习

第一创建云型账户.

第二Android Studio3.4+与Kotlin合作良好,IDE开发演示应用

droid客户端设置

Android开放工作室并创建 Android项目

  1. Android创建项目屏幕选择空活动模板化点击下个.创建新项目
  2. 配置您的项目屏幕显示,输入程序名、打包名等文本字段选择高特林语言化选择Android4.下拉菜单最小SDK,即由应用支持的最低Android版本点击结束.配置您的项目

配置云性详解

  • 编辑您的项目构建.grade文件添加云依赖度以便访问云性特征

    实施组 : com.cloudary,名称:cloudiodroi
  • Androidmanifest.xml文件编辑并添加使用许可标签下的存储权限

    
               
                
                
                
                 
                
               
  • 创建类调用App管理员扩展应用类 :

    公共类App管理员:应用(){覆盖Create{super.onCreate//初始化CloudinaryMediaManer.init/This}}

    App管理员初始化媒体管理器存续周期内,搭建库时需要参数,例如云名定义AndroidManifest.xml文件二进制

  • 添加App管理员类名应用标签AndroidManifest.xml文件 :

    
               
               

代码片段布局


         
         
          
          
         

注意UI两个元素

  • 进度栏上传或下载媒体时向前滑动
  • 按钮从手机选择视频

云信提供两种上传方式:

  • 签名上传中需要后端认证签名上传图像视频签名a客户端使用密钥不安全,很容易分解编译,后端强制使用
  • 无签名上传安全性比签名安全,不需要签名文件大小限制和文件类型等选项可置入非签名预置非签名上传少数限制应用,例如,无法覆盖现有媒体

指定非签名上传演示应用

  1. 点击机牌板并发gear-wheel-shaped图标顶部设置

  2. 点击上传标签靠近顶部滚动上传预置段并点击启用非签名上传.

    云形生成预设用随机字符串命名复制字符串并留待日后使用机牌板

从手机上传视频云化 转换视频GIF并下载GIF文件内存相关代码mainAcity.kt文件 :

private val SELECT_VIDEO: Int = 100 lateinit var TAG:String  override fun onCreate(savedInstanceState: Bundle?) {     super.onCreate(savedInstanceState)     setContentView(R.layout.activity_main)     this.TAG = localClassName     button_upload_video.setOnClickListener {         if (checkStoragePermission()) {             openMediaChooser()         } else {             requestPermission()         }     }      }  fun openMediaChooser() {     val intent = Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)     startActivityForResult(intent, SELECT_VIDEO) }  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {      if (requestCode == SELECT_VIDEO && resultCode == Activity.RESULT_OK) {         progress_bar.visibility = VISIBLE         button_upload_video.visibility = INVISIBLE         MediaManager.get()                 .upload(data!!.data)                 .unsigned("YOUR_PRESET")                 .option("resource_type", "video")                 .callback(object : UploadCallback {                     override fun onStart(requestId: String) {                         Log.d(TAG, "onStart")                     }                      override fun onProgress(requestId: String, bytes: Long, totalBytes: Long) {                      }                      override fun onSuccess(requestId: String, resultData: Map<*, *>) {                         Toast.makeText(this@MainActivity, "Upload successful", Toast.LENGTH_LONG).show()                                              }                      override fun onError(requestId: String, error: ErrorInfo) {                         Log.d(TAG,error.description)                         button_upload_video.visibility = VISIBLE                         progress_bar.visibility = INVISIBLE                         Toast.makeText(this@MainActivity,"Upload was not successful",Toast.LENGTH_LONG).show()                     }                      override fun onReschedule(requestId: String, error: ErrorInfo) {                         Log.d(TAG, "onReschedule")                     }                 }).dispatch()      }  }

上片段包含三大函数;

  • 关于Create:启动时,ap调用函数创建活动时使用布局AndroidManifest.xml文件为活动默认布局点击包含监听器的按钮时,a检查是否有存储权限如果回答为是,ap调用函数openMediaChooser.否则应用请求这些权限并接收后调用openMediaChooser.

    细节解析checkStoragePermission,requestPermissiononPermissionsResult函数内见代码GitHub存储器.

  • openMediaChooser:此函数打开手机画廊选择视频,创建变量中唯一请求代码安全视频.上头startActivityForResult函数表示需要视频选择过程响应onActivityResult函数.如果没有视频选择,ac取消操作

  • onActivityResult上视频选择值结果代码华府市Activity.RESULT_OK.否则值变换Activity.RESULT_CANCELLED.函数检验请求代码是否匹配先前发送代码并验证结果代码读取Activity.RESULT_OK.

成功视频选择触发通过发送云上传请求需要几种方法共四组

  • 上传内含所选视频URI
  • 无签名中包含主机预设名
  • 选项中指定上传资源类型
  • 上传Callback中跟踪上传进度

成功上传时应用调用成功方法内含请求ID请求标识和上传的其他细节可调用新上传视频的 URLresultData["url"].将视频转换为GIF简单修改视频文件扩展.gif像这样

valpublicId:String=结果Data[“公共_id”)sringvalgifell:string=mediamanager.get ().url
         
          >?>().videoSampling("12")!!.width("174").height("232").effect("loop:2"))     .generate("$publicId.gif")
         

云情为每上传视频分配独有ID,通过调用可访问resultData["public_url"].正因如此,结果gifUrl值指基于云名的URLres.www.aaaalireno.com/``<``cloud name``>``/并附视频变换资源类型存取云存储独有ID及其输出格式(GIF文件扩展.gif中例)

代码片段详解GIF文件变换:高度宽度分别压缩到232和174像素设置框架速率12fs并引导GIF循环两次GIF文件比上传视频大, 损耗GIFs的目的, GIFs文件大小应总小于视频对应方

详细视频转换云化,见相关文档

立即通过GIF文件下载PRDown加载器库里执行下列操作:

  1. 添加PRDown加载器依赖点构建.grade文件 :
implementation 'com.mindorks.android:prdownloader:0.2.0'
  1. 初始化PRDown加载器AppController.kt文件 :
public class AppController : Application() {         override fun onCreate() {             super.onCreate()             // Initialize Cloudinary             MediaManager.init(this)             // Initialize the PRDownload library             PRDownloader.initialize(this)         }     }
  1. 创建函数调用下载GIF处理下载
private fun downloadGIF(url: String, name: String) {         val downloadId =                 PRDownloader                         .download(url, getRootDirPath(), name).build()                         .setOnStartOrResumeListener(object : OnStartOrResumeListener {                             override fun onStartOrResume() {                                 Log.d(TAG,"download started")                             }                         })                         .setOnPauseListener(object : OnPauseListener {                             override fun onPause() {                                  }                         })                         .setOnCancelListener(object : OnCancelListener {                             override fun onCancel() {                                  }                         })                         .setOnProgressListener(object : OnProgressListener {                             override fun onProgress(progress: Progress) {                                  }                         })                         .start(object : OnDownloadListener {                             override fun onDownloadComplete() {                                 progress_bar.visibility = INVISIBLE                                 Toast.makeText(this@MainActivity,"Download complete",Toast.LENGTH_LONG).show()                             }                                  override fun onError(error: Error) {                                 Log.d(TAG,error.toString())                             }                         })          }          private fun getRootDirPath(): String {         return if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {             val file = ContextCompat.getExternalFilesDirs(this@MainActivity,                     null)[0]             file.absolutePath         } else {             this@MainActivity.filesDir.absolutePath         }     }

PRDownload.download取三大参数:待下载文件的URL、置放目录和文件名正因如此 后代gifUrl程序调用PRDownload.download成功函数集上传Callback中显示

excess(repId:String,结果Data:map++++++++++++++++++++下载GIF(gifUrl,$publicId.gif)

最后,app将下载文件放进目录Android/data/app包名++/file手机里

云化提供无数实用直觉API操作并存储视觉媒体演示应用本文章描述 仅仅是冰山一角检查细节云型APIs和其他功能.ac全源码见GitHub存储器.

回顶

特征邮箱

Baidu
map