您的位置:

首页 >

软件编程 >

Android视频压缩的示例代码 >

Android视频压缩的示例代码

2016-05-18 10:28:12

分类:软件编程

最近由于项目需求,需要对自己录制的视频进行压缩并发送。本篇主要说的是视频的压缩,所以关于视频的录制和上传、发送就不在这里做过多表述了。背景:以前从来没有做过关于视频方面的项目,所以在刚接受这个项目的时候,有点头大,当然了,迎难而上是我们攻城狮必备的品质。所以我就在网上搜索关于视频编解码的知识,搜到最多的就是ffmpeg,那么什么是ffmpeg呢?简单说FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。它主要包括:视频的采集,视频的编辑,视频的截图,视频的水印等,想仔细了解的可以自行百度。好了,下面大道理我就不说了,我只告诉你怎么使用,毕竟我也只是会使用而已。下面会附上下载地址。下载好以后按照我放的目录放就行了。cmd = "-y -i /storage/emulated/0/coollang/vedio/2.mp4 -strict -2 -vcodec libx264 -preset ultrafast -crf 24 -acodec aac -ar 44100 -ac 2 -b:a 96k -s 640x352 -aspect 16:9 /storage/emulated/0/coollang/vedio/1.mp4"; com = new Compressor(this); com.loadBinary(new InitListener() { @Override public void onLoadSuccess() { com.execCommand(cmd,new CompressListener() { @Override public void onExecSuccess(String message) { Log.i("success",message); } @Override public void onExecFail(String reason) { Log.i("fail",reason); } @Override public void onExecProgress(String message) { Log.i("progress",message); } }); } @Override public void onLoadFail(String reason) { Log.i("fail",reason); } }); 在这个demo里面需要注意的就是assets,jin,libs文件夹下的文件对应你自己的目录存放进去。下面这个指令的意思:复制代码 代码如下:"-y -i 待压缩目录 -strict -2 -vcodec libx264 -preset ultrafast -crf 24 -acodec aac -ar 44100 -ac 2 -b:a 96k -s 640x352 -aspect 16:9 压缩后的目录"; InitListener是对压缩过程的一个监听,onExecSuccess表示压缩成功,onExecFail表示压缩失败,一般失败的原因都是你自己地址出错,所以要细心点。onExecProgress压缩的进度。关于这个工具知道这么多就够了,关键在于自己动手试试。下载地址:Android-Video-Compressor_jb51.rar以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

随着Android系统的不断升级,相关Notification的用法有很多种,有的方法可能已经被android抛弃了,下面为大家分享一下个人如何实现Android Notification通知小案例源代码,供大家参考。Android Notification.Builder通知小案例,具体代码示例如下:package com.example.day6ke;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.os.Build;import android.support.annotation.RequiresApi;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { private Button btn; private NotificationManager Manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn= (Button) findViewById(R.id.bnt); Manager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); btn.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override public void onClick(View v) { Notification.Builder builder=new Notification.Builder(MainActivity.this); builder.setContentTitle("通知"); builder.setContentText("正文"); builder.setSmallIcon(R.mipmap.ic_launcher); //的到PendingIntent(延迟意图)的对象 PendingIntent pendingIntent =PendingIntent.getActivity(MainActivity.this, 2020,new Intent(MainActivity.this, Main2Activity.class), PendingIntent.FLAG_ONE_SHOT); builder.setContentIntent(pendingIntent); //点击通知是否消失 该方法与PendingIntent 一起使用才有效果 builder.setAutoCancel(true); Manager.notify(1,builder.build()); } }); }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Java 中HttpURLConnection附件上传的实例详解整合了一个自己写的采用Http做附件上传的工具,分享一下!示例代码:/** * 以Http协议传输文件 * * @author [email protected] * */ public class HttpPostUtil { private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" .toCharArray(); private URL url; private HttpURLConnection conn; private String boundary = null; private Map<String, String> textParams = new HashMap<String, String>(); private Map<String, File> fileparams = new HashMap<String, File>(); public HttpPostUtil(String url) throws Exception { this.url = new URL(url); } // 重新设置要请求的服务器地址,即上传文件的地址。 public void setUrl(String url) throws Exception { this.url = new URL(url); } // 增加一个普通字符串数据到form表单数据中 public void addTextParameter(String name, String value) { textParams.put(name, value); } // 增加一个文件到form表单数据中 public void addFileParameter(String name, File value) { fileparams.put(name, value); } // 清空所有已添加的form表单数据 public void clearAllParameters() { textParams.clear(); fileparams.clear(); } /** * 发送数据到服务器 * * @return 一个字节包含服务器的返回结果的数组 * @throws Exception */ public byte[] send() throws Exception { initConnection(); try { conn.connect(); } catch (SocketTimeoutException e) { throw new Exception(e); } OutputStream connOutStream = new DataOutputStream( conn.getOutputStream()); writeFileParams(connOutStream); writeStringParams(connOutStream); writesEnd(connOutStream); InputStream responseInStream = conn.getInputStream(); ByteArrayOutputStream responseOutStream = new ByteArrayOutputStream(); int len; byte[] bufferByte = new byte[1024]; while ((len = responseInStream.read(bufferByte)) != -1) { responseOutStream.write(bufferByte, 0, len); } responseInStream.close(); connOutStream.close(); conn.disconnect(); byte[] resultByte = responseOutStream.toByteArray(); responseOutStream.close(); return resultByte; } // 文件上传的connection的一些必须设置 private void initConnection() throws Exception { StringBuffer buf = new StringBuffer("----"); Random rand = new Random(); for (int i = 0; i < 15; i++) { buf.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]); } this.boundary = buf.toString(); conn = (HttpURLConnection) this.url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); conn.setConnectTimeout(3 * 60 * 1000); // 连接超时为10秒 conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); } // 普通字符串数据 private void writeStringParams(OutputStream out) throws Exception { Set<String> keySet = textParams.keySet(); for (Iterator<String> it = keySet.iterator(); it.hasNext();) { String name = it.next(); String value = textParams.get(name); out.write(("--" + boundary + "\r\n").getBytes()); out.write(("Content-Disposition: form-data; name=\"" + name + "\"\r\n") .getBytes()); out.write(("\r\n").getBytes()); out.write((encode(value) + "\r\n").getBytes()); } } // 文件数据 private void writeFileParams(OutputStream out) throws Exception { Set<String> keySet = fileparams.keySet(); for (Iterator<String> it = keySet.iterator(); it.hasNext();) { String name = it.next(); File value = fileparams.get(name); out.write(("--" + boundary + "\r\n").getBytes()); out.write(("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + encode(value.getName()) + "\"\r\n") .getBytes()); out.write(("Content-Type: " + getContentType(value) + "\r\n") .getBytes()); out.write(("Content-Transfer-Encoding: " + "binary" + "\r\n") .getBytes()); out.write(("\r\n").getBytes()); FileInputStream inStream = new FileInputStream(value); int bytes = 0; byte[] bufferByte = new byte[1024]; while ((bytes = inStream.read(bufferByte)) != -1) { out.write(bufferByte, 0, bytes); } inStream.close(); out.write(("\r\n").getBytes()); } } // 添加结尾数据 private void writesEnd(OutputStream out) throws Exception { out.write(("--" + boundary + "--" + "\r\n").getBytes()); out.write(("\r\n").getBytes()); } // 获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream private String getContentType(File f) throws Exception { String fileName = f.getName(); if (fileName.endsWith(".jpg")) { return "image/jpeg"; } else if (fileName.endsWith(".png")) { return "image/png"; } return "application/octet-stream"; } // 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码 private String encode(String value) throws Exception { return URLEncoder.encode(value, "UTF-8"); } } 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

题目:输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。程序设计:import java.util.*;public class test { public static void main (String[]args){ int day=0; int month=0; int year=0; int sum=0; int leap; System.out.print("请输入年,月,日\n"); Scanner input = new Scanner(System.in); year=input.nextInt(); month=input.nextInt(); day=input.nextInt(); switch(month) /*先计算某月以前月份的总天数*/ { case 1: sum=0;break; case 2: sum=31;break; case 3: sum=59;break; case 4: sum=90;break; case 5: sum=120;break; case 6: sum=151;break; case 7: sum=181;break; case 8: sum=212;break; case 9: sum=243;break; case 10: sum=273;break; case 11: sum=304;break; case 12: sum=334;break; default: System.out.println("data error");break; } sum=sum+day; /*再加上某天的天数*/ if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/ leap=1; else leap=0; if(leap==1 && month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ sum++; System.out.println("It is the the day:

1.什么是内部类?定义在类内部的类,称之为内部类 public class Out{   class In{ //此时In就是内部类   } }2.为什么要使用内部类?1),增强封装,把内部类隐藏在外部类中,不允许其他类来访问内部类2),内部类能提高代码的可读性和可维护性3.内部类的分类对于内部类的分类,可以对比于成员变量的分类.我们可以根据不同的修饰符或者定义的不同位置把成员变量,可以细分为:类成员变量,实例成员变量,局部变量.内部类看做是外部类的一个成员,那么内部类可以使用public/缺省/protected/private修饰.还可以是static修饰.同理,内部类也根据使用不同的修饰符或者定义的不同位置,将其分成4类:1),实例内部类:内部类没有使用static修饰2),静态内部类:内部类使用static修饰3),局部内部类:在方法中定义的内部类4),匿名内部类:只能使用一次,属于内部类的一种特殊情况3.1实例内部类:1)定义:实例内部类,即没有使用static修饰的内部类.这说明,实例内部类属于外部类的对象,不属于外部类本身(类比字段).2)创建实例内部类//外部类class Outter { // 实例内部类:没有使用static修饰 class Inner { }}public class InnerDemo1 { public static void main(String[] args) { // 创建实例内部类,没有使用static修饰,属于外部类的对象,因此,创建实例内部类前,必须存在外部类对象 Outter out = new Outter(); // 通过外部类对象创建内部类对象 Outter.Inner in = out.new Inner(); }}3)特点:a.由创建实例内部类的过程可知,当存在内部类对象时,一定存在外部类对象.b.实例内部类的实例自动持有外部类的实例的引用,实例内部类可以无条件访问外部类的所有字段和方法注意:当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象c.外部类中不能直接访问内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问//外部类class Outter { private String name = "out"; private Integer age = 17; // 实例内部类:没有使用static修饰 class Inner { private Integer age = 18; // 隐藏现象,隐藏了外部类的age Inner() { // 特点:1.实例内部类能直接访问外部类成员 // 2.当实例内部类和外部类有同名的字段或者方法时,会发生隐藏现象 System.out.println(name + this.age);// 输出out18 // 此时若需要使用外部类的age,语法:外部类.this.age System.out.println(Outter.this.age);// 输出17 } }}总结:简单来说,就是看变量的作用域,外部类成员变量的作用域是整个外部类,而内部类在外部类中(可以看做外部类的字段),内部类自然就可以访问外部类.而外部类要去访问内部类的成员,可以这样理解:内部类的成员属于内部类,在内部类中有效,内部类都不存在,其中的成员变量也不会存在,所以,外部类中不能直接访问内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问.3.2静态内部类1)定义:使用static修饰的内部类.所以,该内部类属于外部类本身,而不属于外部类的对象2)创建静态内部类//外部类class Outter { // 静态内部类:使用static修饰 static class Inner { }}public class InnerDemo2 { public static void main(String[] args) { // 因为静态内部类属于外部类本身,可以直接通过外部类类名来访问(类比字段) Outter.Inner in = new Outter.Inner(); }}3)特点:a.在创建内部类的实例时,不必创建外部类的实例.b.静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,必须通过外部类的实例去访问.简单理解:静态成员属于类,非静态成员属于对象,如果要访问外部类的实例成员(非静态成员),当然要先存着外部类对象的.而静态内部类的创建是不需要外部类的对象,因此,如果访问外部类的实例成员,必须通过外部类的实例去访问.c.在静态内部类中可以定义静态成员和实例成员.d.测试类可以通过完整的类名直接访问静态内部类的静态成员.//外部类class Outter { static String name = "outter"; public Integer age = 17; // 静态内部类:使用static修饰 static class Inner { Inner() { // 静态内部类能直接访问外部类的静态成员 System.out.println(name);// 输出 outter // 访问外部类的实例成员,必须通过外部类的实例去访问. System.out.println(new Outter().age);// 输出 17 } }}3.3局部内部类(几乎用不到)1)定义:在方法中定义的内部类,其可见范围是当前方法,和局部变量是同一个级别,所以局部内部类只能在方法中使用.注意,局部内部类和方法里面的局部变量一样,是不能有public、protected、private以及static修饰符的。public class InnerDemo3 { public static void main(String[] args) { // 局部内部类 class Inner { } }}2)特点:a.局部内部类和实例内部类一样,不能包含静态成员.(局部内部类属于方法,而静态成员属于类)b.局部内部类和实例内部类,可以访问外部类的所有成员.c.局部内部类访问的局部变量必须使用final修饰,在Java8中是自动隐式加上final(语法糖).原因:当方法被调用运行完毕之后,当前方法的栈帧被销毁,方法内部的局部变量的空间全部销毁.但内部类对象可能还在堆内存中,要直到没有被引用时才会消亡.此时就会出现一种情况:内部类要访问一个不存在的局部变量.为了避免该问题,我们使用final修饰局部变量,从而变成常量,永驻内存空间,即使方法销毁之后,该局部变量也在内存中,对象可以继续持有.public class InnerDemo3 { public static void main(String[] args) { int age = 17; final int num = 15; // 局部内部类 class Inner { public void test() { // 报错:Cannot refer to a non-final variable age inside an inner class defined in a different method System.out.println(age); System.out.println(num);// 正确 } } }}3.4匿名内部类(使用最频繁)1):定义:匿名内部类是一个没有名称的局部内部类,适合于只使用一次的类.2)创建匿名内部类:匿名内部类本身没有构造器,但是会调用父类构造器.一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写.注意:匿名内部类必须继承一个父类或者实现一个接口,但最多只能一个父类或实现一个接口.//定义一个接口interface Person { public void eat();}public class AnonymousDemo { public static void main(String[] args) { // 使用匿名内部类 Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); }}4.总结5.面试题public class Outer { public void someOuterMethod() { // Line 3 } public class Inner { } public static void main(String[] argv) { Outer o = new Outer(); // Line 8 }}/* * Which instantiates an instance of Inner?A. new Inner(); // At line 3B. new Inner(); // At line 8C. new o.Inner(); // At line 8D. new Outer.Inner(); // At line 8 */答案A.new Inner();等价于this.new Inner();已经存在一个Outer类对象了.line 8 正确写法,应为: o.new Inner();以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 腾博会官网 网站地图

联系我们

827570882

扫描二维码分享到微信