-
Android中如何编码url字符串?
2013-01-09 07:53:28但是我不知道如何编码url字符串。请问如何编码url字符串? 我贴出URL和代码 URL: ... -
x265探索与研究(四):如何编码视频?
2016-01-04 16:37:29如何编码视频? 本文介绍x265中的两种编码视频方法,一是采用命令行的方法;二是GUI的方式。 1、命令行的方法 (1)、第一种方式生成*.265格式的视频文件 第一种方式可以生成*.265格式的...如何编码视频?
本文介绍x265中的两种编码视频方法,一是采用命令行的方法;二是GUI的方式。
1、命令行的方法
(1)、第一种方式生成*.265格式的视频文件
第一种方式可以生成*.265格式的视频文件,对应的命令为:
x265 --input-res 352x288 --fps 30 hall_cif_352x288_300.yuv -o hall_cif_352x288_300.h265
(2)、第二种方式可以生成*.bin格式的视频流文件
第二种方式可以生成*.bin格式的视频流文件,对应的命令为:
x265.exe --preset fast --input hall_cif_352x288_300.yuv --fps 30 --input-res 352x288 --output out.bin --psnr --ssim --bitrate 128
两种方式生成的对应文件如下图所示:
除了这两种经测试可以使用的方式外,网址:http://x265.ru/en/encode/还提供了两种略有区别的命令行方式,如下图所示:
(3)、第三种命令行的方式,可以生成*.x265和*.csv
下面对其进行测试,第三种命令行的方式,可以生成*.x265和*.csv,对应的命令为:
x265.exe hall_cif_352x288_300.yuv --input-res 352x288 --fps 30 -o out.x265 --csv results.csv --no-rect --max-merge 3 --rd 0 --tu-intra-depth 2 --tu-inter-depth 1 --no-tskip --frame-threads 2
需要注意的是:该方式输入的视频必须是YUV或Y4M格式,帧的宽和高也必须指定且FPS也必须设定。测试过程如下图:
测试结果如下图:
(4)、第四种命令行方式输出是*.hevc格式
该命令行的方式,输入是*.y4m的视频,可以获得高质量的*.hevc格式视频,对应的命令为:
x265.exe hall_cif_352x288_300.y4m --q 17 --merange 64 --frames all --ref 4 --max-merge 3 --rect-hash 2 --me 3 --b 6 --b-adapt 1 --rd 2 --rc-lookahead 60 --input-depth 16 --tu-inter-depth 3 --tu-intra-depth 3 --no-tskip-fast --wpp --subme 2 --s 32 --F 6 -o video.hevc
(注:由于我这边没有*.y4m格式视频,故没有测试,后续测试,补充在此。)
2、GUI的方法
采用“Baka Encoder”,下载网址:http://x265.ru/en/baka-encoder/
配置方式是修改Baka Encoder.config.xml,对应的代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <!-- Baka Encoder configuration file reference can be found at http://vtt.to/baka%20encoder%20configuration%20reference --> <baka_encoder logging="0"> <presets> <preset name="preview" suffix="_preview" on="1"> <hint quality="7" compression="14" speed="6" streaming="1"/> <audio cmd="-br 60000"/> <video tool="x264" bit_depth="8" pass_count="2" max_width="480" max_height="360" resize_method="spline" base_bitrate="0" max_bitrate="0" cmd="--preset placebo --no-mbtree --ratetol 100.0 --keyint 60 --ref 3 --bitrate 500 --level 4.1 --vbv-bufsize 50000 --vbv-maxrate 62500"/> <muxing container="mp4" cmd=" --optimize-pd"/> </preset> <preset name="normal" suffix="_normal" on="1"> <hint quality="11" compression="9" speed="3" streaming="1"/> <audio cmd="-q 0.6"/> <video tool="x264" bit_depth="8" pass_count="2" max_width="1280" max_height="960" resize_method="spline" base_bitrate="1500" max_bitrate="3500" cmd="--preset placebo --no-mbtree --ratetol 100.0 --keyint 60 --ref 4 --level 4.1 --vbv-bufsize 50000 --vbv-maxrate 62500"/> <muxing container="mp4" cmd=" --optimize-pd"/> </preset> <preset name="normal h265" suffix="_normal.h265" on="1"> <hint quality="12" compression="9" speed="1" streaming="0"/> <audio cmd="-q 0.6"/> <video tool="x265" bit_depth="8" pass_count="2" max_width="1280" max_height="960" resize_method="spline" base_bitrate="1200" max_bitrate="10000" cmd="--preset slow --bframes 4 --ref 4"/> <muxing container="mp4" cmd=""/> </preset> <preset name="deluxe" suffix="_deluxe" on="0"> <hint quality="14" compression="5" speed="4" streaming="0"/> <audio cmd="-q 1.0"/> <video tool="x264" bit_depth="10" pass_count="1" max_width="0" max_height="0" resize_method="" base_bitrate="0" max_bitrate="0" cmd="--crf 12 --preset placebo --no-mbtree --deblock 0:-1"/> <muxing container="mp4" cmd=""/> </preset> <preset name="deluxe h265" suffix="_deluxe.h265" on="0"> <hint quality="15" compression="7" speed="1" streaming="0"/> <audio cmd="-q 1.0"/> <video tool="x265" bit_depth="10" pass_count="1" max_width="0" max_height="0" resize_method="" base_bitrate="0" max_bitrate="0" cmd="--crf 12 --preset slow"/> <muxing container="mp4" cmd=""/> </preset> <preset name="express" suffix="_express" on="0"> <hint quality="7" compression="7" speed="10" streaming="0"/> <audio cmd="-q 0.5"/> <video tool="x264" bit_depth="8" pass_count="1" max_width="0" max_height="0" resize_method="" base_bitrate="1500" max_bitrate="5000" cmd="--preset fast --deblock 1:0 --bframes 4 --b-adapt 1 --rc-lookahead 36 --ref 3 --level 4.1 --vbv-bufsize 50000 --vbv-maxrate 62500"/> <muxing container="mp4" cmd=""/> </preset> <preset name="lossless" suffix="_lossless" on="0" console="0"> <hint quality="16" compression="3" speed="8" streaming="0"/> <audio cmd="-q 1.0"/> <video tool="x264" bit_depth="8" pass_count="1" max_width="0" max_height="0" resize_method="spline" base_bitrate="0" max_bitrate="0" cmd="--crf 0 --preset placebo --log-level none --quiet"/> <muxing container="mp4" cmd=""/> </preset> </presets> </baka_encoder>
-
Java中文乱码解决之道:Java是如何编码解码的
2016-05-30 09:42:21Java中文乱码解决之道:Java是如何编码解码的编码&解码
在上篇博客中LZ阐述了三个渠道的编码转换过程,下面LZ将结束java在那些场合需要进行编码和解码操作,并详序中间的过程,进一步掌握java的编码和解码过程。在java中主要有四个场景需要进行编码解码操作:
1:I/O操作
2:内存
3:数据库
4:javaWeb
下面主要介绍前面两种场景,数据库部分只要设置正确编码格式就不会有什么问题,javaWeb场景过多需要了解URL、get、POST的编码,servlet的解码,所以javaWeb场景下节LZ介绍。
I/O操作
在前面LZ就提过乱码问题无非就是转码过程中编码格式的不统一产生的,比如编码时采用UTF-8,解码采用GBK,但最根本的原因是字符到字节或者字节到字符的转换出问题了,而这中情况的转换最主要的场景就是I/O操作的时候。当然I/O操作主要包括网络I/O(也就是javaWeb)和磁盘I/O。网络I/O下节介绍。
首先我们先看I/O的编码操作。
InputStream为字节输入流的所有类的超类,Reader为读取字符流的抽象类。java读取文件的方式分为按字节流读取和按字符流读取,其中InputStream、Reader是这两种读取方式的超类。
按字节
我们一般都是使用InputStream.read()方法在数据流中读取字节(read()每次都只读取一个字节,效率非常慢,我们一般都是使用read(byte[])),然后保存在一个byte[]数组中,最后转换为String。在我们读取文件时,读取字节的编码取决于文件所使用的编码格式,而在转换为String过程中也会涉及到编码的问题,如果两者之间的编码格式不同可能会出现问题。例如存在一个问题test.txt编码格式为UTF-8,那么通过字节流读取文件时所获得的数据流编码格式就是UTF-8,而我们在转化成String过程中如果不指定编码格式,则默认使用系统编码格式(GBK)来解码操作,由于两者编码格式不一致,那么在构造String过程肯定会产生乱码,如下:
File file = new File("C:\\test.txt"); InputStream input = new FileInputStream(file); StringBuffer buffer = new StringBuffer(); byte[] bytes = new byte[1024]; for(int n ; (n = input.read(bytes))!=-1 ; ){ buffer.append(new String(bytes,0,n)); } System.out.println(buffer);
输出结果:锘挎垜鏄?cm
test.txt中的内容为:我是 cm。
要想不出现乱码,在构造String过程中指定编码格式,使得编码解码时两者编码格式保持一致即可:
buffer.append(new String(bytes,0,n,"UTF-8"));
按字符
其实字符流可以看做是一种包装流,它的底层还是采用字节流来读取字节,然后它使用指定的编码方式将读取字节解码为字符。在java中Reader是读取字符流的超类。所以从底层上来看按字节读取文件和按字符读取没什么区别。在读取的时候字符读取每次是读取留个字节,字节流每次读取一个字节。
字节&字符转换
字节转换为字符一定少不了InputStreamReader。API解释如下:InputStreamReader 是字节流通向字符流的桥梁:它使用指定的
读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。API解释非常清楚,InputStreamReader在底层读取文件时仍然采用字节读取,读取字节后它需要根据一个指定的编码格式来解析为字符,如果没有指定编码格式则采用系统默认编码格式。charset
String file = "C:\\test.txt"; String charset = "UTF-8"; // 写字符换转成字节流 FileOutputStream outputStream = new FileOutputStream(file); OutputStreamWriter writer = new OutputStreamWriter(outputStream, charset); try { writer.write("我是 cm"); } finally { writer.close(); } // 读取字节转换成字符 FileInputStream inputStream = new FileInputStream(file); InputStreamReader reader = new InputStreamReader( inputStream, charset); StringBuffer buffer = new StringBuffer(); char[] buf = new char[64]; int count = 0; try { while ((count = reader.read(buf)) != -1) { buffer.append(buf, 0, count); } } finally { reader.close(); } System.out.println(buffer);
内存
首先我们看下面这段简单的代码
String s = "我是 cm"; byte[] bytes = s.getBytes(); String s1 = new String(bytes,"GBK"); String s2 = new String(bytes);
在这段代码中我们看到了三处编码转换过程(一次编码,两次解码)。先看String.getTytes():
public byte[] getBytes() { return StringCoding.encode(value, 0, value.length); }
内部调用StringCoding.encode()方法操作:
static byte[] encode(char[] ca, int off, int len) { String csn = Charset.defaultCharset().name(); try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); } try { return encode("ISO-8859-1", ca, off, len); } catch (UnsupportedEncodingException x) { // If this code is hit during VM initialization, MessageUtils is // the only way we will be able to get any kind of error message. MessageUtils.err("ISO-8859-1 charset not available: " + x.toString()); // If we can not find ISO-8859-1 (a required encoding) then things // are seriously wrong with the installation. System.exit(1); return null; } }
encode(char[] paramArrayOfChar, int paramInt1, int paramInt2)方法首先调用系统的默认编码格式,如果没有指定编码格式则默认使用ISO-8859-1编码格式进行编码操作,进一步深入如下:
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
同样的方法可以看到new String 的构造函数内部是调用StringCoding.decode()方法:
public String(byte bytes[], int offset, int length, Charset charset) { if (charset == null) throw new NullPointerException("charset"); checkBounds(bytes, offset, length); this.value = StringCoding.decode(charset, bytes, offset, length); }
decode方法和encode对编码格式的处理是一样的。
对于以上两种情况我们只需要设置统一的编码格式一般都不会产生乱码问题。
编码&编码格式
首先先看看java编码类图[1]
首先根据指定的chart设置ChartSet类,然后根据ChartSet创建ChartSetEncoder对象,最后再调用 CharsetEncoder.encode 对字符串进行编码,不同的编码类型都会对应到一个类中,实际的编码过程是在这些类中完成的。下面时序图展示详细的编码过程:
通过这编码的类图和时序图可以了解编码的详细过程。下面将通过一段简单的代码对ISO-8859-1、GBK、UTF-8编码
public class Test02 { public static void main(String[] args) throws UnsupportedEncodingException { String string = "我是 cm"; Test02.printChart(string.toCharArray()); Test02.printChart(string.getBytes("ISO-8859-1")); Test02.printChart(string.getBytes("GBK")); Test02.printChart(string.getBytes("UTF-8")); } /** * char转换为16进制 */ public static void printChart(char[] chars){ for(int i = 0 ; i < chars.length ; i++){ System.out.print(Integer.toHexString(chars[i]) + " "); } System.out.println(""); } /** * byte转换为16进制 */ public static void printChart(byte[] bytes){ for(int i = 0 ; i < bytes.length ; i++){ String hex = Integer.toHexString(bytes[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } System.out.print(hex.toUpperCase() + " "); } System.out.println(""); } } -------------------------outPut: 6211 662f 20 63 6d 3F 3F 20 63 6D CE D2 CA C7 20 63 6D E6 88 91 E6 98 AF 20 63 6D
通过程序我们可以看到“我是 cm”的结果为:
char[]:6211 662f 20 63 6d
ISO-8859-1:3F 3F 20 63 6D
GBK:CE D2 CA C7 20 63 6D
UTF-8:E6 88 91 E6 98 AF 20 63 6D图如下:
更多&参考文献
对于这两种场景我们只需要设置一致正确的编码一般都不会产生乱码问题,通过LZ上面的阐述对于java编码解码的过程应该会有一个比较清楚的认识。其实在java中产生乱码的主要场景是在javaWeb中,所以LZ下篇博文就来讲解javaWeb中的乱码产生情形。
1、Java 编程技术中汉字问题的分析及解决:http://www.ibm.com/developerworks/cn/java/java_chinese/。
-
Vb中如何编码撤销功能,也就是返回上一步的操作!求代码
2016-05-11 06:09:27Vb中如何编码撤销功能,也就是返回上一步的操作!求代码!求解答! -
Mac开发中,请问如何编码实现操作finder打开指定目录,谢谢!
2016-12-29 15:33:52 -
Java 中char是如何编码的
2016-05-23 14:44:54下面的内容不是我写的,抄的知乎的,...内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码; 外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是cha下面的内容不是我写的,抄的知乎的,看一下人家过来人是怎么理解的,我在这里记录一下,以后想不通的时候过来看看.
题主要区分清楚内码(internal encoding)和外码(external encoding)就好了。内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;
外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行参数之类的。Java语言规范规定,Java的char类型是UTF-16的code unit,也就是一定是16位(2字节);
char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).
然后字符串是UTF-16 code unit的序列:
The Java programming language represents text in sequences of 16-bit code units, using the UTF-16 encoding.
这样,Java规定了字符的内码要用UTF-16编码。String.getBytes()是一个用于将String的内码转换为指定的外码的方法。无参数版使用平台的默认编码作为外码,有参数版使用参数指定的编码作为外码;将String的内容用外码编码好,结果放在一个新byte[]返回。
题主的例子里,显然外码是UTF-8,那么调用了String.getBytes()之后得到的byte[]只能表明该外码的性质,而无法碰触到String内码的任何特质。可惜UTF-16在Java设计之初还是真的定长编码,后来Unicode涵盖的字符变多了之后UTF-16变成了坑爹的变长编码(一个完整的“字符”是一个code point;一个code point可以对应1到2个code unit;一个code unit是16位),Java也只好跟进。
如果你说的“字符”就是指Java中的char,那好,那它就是16位,2字节。
如果你说的“字符”是指我们用眼睛看到的那些“抽象的字符”,那么,谈论它占几个字节是没有意义的。
具体地讲,脱离具体的编码谈某个字符占几个字节是没有意义的。
就好比有一个抽象的整数“42”,你说它占几个字节?这得具体看你是用byte,short,int,还是long来存它。
字符是同样的道理,如果你想谈“占几个字节”,就要先把编码说清楚。
同一个字符在不同的编码下可能占不同的字节。
就以你举的“字”字为例,“字”在GBK编码下占2字节,在UTF-16编码下也占2字节,在UTF-8编码下占3字节,在UTF-32编码下占4字节。
不同的字符在同一个编码下也可能占不同的字节。
“字”在UTF-8编码下占3字节,而“A”在UTF-8编码下占1字节。(因为UTF-8是变长编码)
而Java中的char本质上是UTF-16编码。而UTF-16实际上也是一个变长编码(2字节或4字节)。
如果一个抽象的字符在UTF-16编码下占4字节,显然它是不能放到char中的。换言之,char中只能放UTF-16编码下只占2字节的那些字符。
而getBytes实际是做编码转换,你应该显式传入一个参数来指定编码,否则它会使用缺省编码来转换。你可以在启动JVM时设置一个缺省编码,否则,会使用所在操作系统环境下的缺省编码。 -
如何编码实现NTFS格式下删除文件的恢复(结束)
2010-01-18 23:18:00写完"如何编码实现NTFS格式下删除文件的恢复"和"如何编码实现NTFS格式下删除文件的恢复(续一)"后,好多朋友询问下文,但是最近忙着写别的东西,实在是没工夫继续写,我把所有的源代码都公开在这里,只是代码都没怎么整理,... -
URL中的空格字符如何编码
2016-01-14 23:24:58URL encoding the space character: + or %20?简单理解: ‘?’前的路径中的空格必须为’20%’ ‘?’后的参数中空格可以被编码成’+’,然而有时候需要手动替换为’20%’ -
经典飞机大战如何编码实现?可以用 Python 写一个!
2020-05-30 12:16:57玩过这款游戏吗? -
java中文乱码解决之道(五)-----java是如何编码解码的
2015-01-20 09:29:53下面LZ就讲述java在转码过程中是如何来进行编码和解码操作的。编码&解码 在上篇博客中LZ阐述了三个渠道的编码转换过程,下面LZ将结束java在那些场合需要进行编码和解码操作,并详序中间的过程,进一步掌握java的编码... -
如何编码实现wifi连接,全程不需要人工干预!
2016-07-18 09:29:46在已知无线ssid和密码前提下,如何实现自动连接到热点,不需人工干预!请知道的帮忙给下代码,无论使用哪门语言都可以,知道逻辑的也可以说下。谢谢啦, -
【科普】大脑是如何编码复杂信息的?
2018-07-21 22:47:05神经元是如何编码成组的信号的 。”杜克大学心理与神经科学系的科学家Valeria Caruso说道。 更复杂的是,对于单个神经元的研究表明,许多感觉神经元能够对一个宽广频率范围内不同的声音做出反应。例如,你朋友的声音... -
详细剖析GET/POST提交如何编码以及服务器如何解码以及乱码解决方案
2014-03-06 15:09:47GET方式提交出现乱码 对于GET方式,我们知道它的提交是将请求数据附加到URL后面作为...具体规则百度URL编码规则。 这里详细说一下encode的过程中容易出现的问题,在这个过程中我们要明白需要URL encode的字符一般 -
url是如何编码我们提交的数据的
2014-08-11 00:04:26一样的,二火狐与chrome不太一样,如图他们的url只是部分编码,不对,firefox是在url中不予以显示编码后,直接是编码前的所以firefox还是相对比较安全的。 当然这里还有一种提交方式是post方式。当然我们如果要对... -
如何编码实现NTFS格式下删除文件的恢复
2009-12-18 14:37:00主要内容一、NTFS系统结构原理二、编码实现NTFS磁盘删除文件扫描三、编码实现NTFS磁盘删除文件恢复 (编码实现的磁盘文件恢复小工具下载地址) 工具截图 第一部分 NTFS系统结构原理 NTFS是Windows NT引入的新型... -
控制台或Winform程序中如何编码或解码Server.URLEncode
2012-05-07 21:57:18在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特殊字符编码, 但在控制台或Winform程序中没有办法使用到这些方法, 解决办法: 右击项目==》添加引用==》.NET==》System.Web==》... -
如何编码之使用接口作为方法的参数类型
2011-02-11 10:36:00使用接口作为方法的参数类型的好处是显而易见的。一个方法,当接收接口类型的参数时,我们就可以自定义一个类实现该接口,然后将该类作为方法的参数。而且,在自定义类中,还可以继承一个已经存在的类,然后,... -
java如何使用iso-8859-1编码进行编码的转换
2019-03-23 22:22:52其实我们往往不知道他到底是如何编码的, 而有时候需要使用httpclient进行请求数据,往往把中文进行编码来更好地适应一些规范,防止兼容性问题, 一般,我们在请求url时一般也会自动编码为iso-8859-1,其实,这个... -
遗传算法(C# )如何进行编码
2016-05-13 07:10:40矩形优化摆放问题(将一批尺寸不同的矩形摆放在固定尺寸的平台上)该如何编码?没思路 试了几种编码都不行 -
如何使用foxpro实现哈夫曼编码 如何使用foxpro实现哈夫曼编码
2015-09-01 08:07:04如何使用foxpro实现哈夫曼编码 如何使用foxpro实现哈夫曼编码 # 如题__ -
Android 如何快速的定位错误和解决错误,如何去编码
2018-01-26 10:56:32本篇文章主要分为五章,分别讲解如何编码、熟悉别人代码、定位和解决bug、常见bug产生后的效果和如何提升个人效率。每一章我将会从【预期效果,不可预期效果,事件驱动,逻辑驱动,代码驱动】五个方面让读者去理解和... -
如何建立编码规范?
2011-04-06 21:54:00如何建立编码规范 -
如何自动生成编码
2019-07-17 15:50:27那么要如何去生成这些编码呢 下面我就演示两个生成编码的方法,先来看下基础样式和代码 样式比较简单,主要是为了演示效果 下面来说下第一种方法,它是通过获取时间去拼接成编码的 上面分别获取了年、月、日、时... -
如何修改文件编码
2019-12-13 17:35:19将文件使用 notepad++ 打开,【编码】->【转为UTF-8编码】 -
拨开字符编码的迷雾--编译器如何处理文件编码
2017-11-27 21:29:35一. Visual Studio字符集 ...但这个设置项不会对编译器处理字符编码产生直接的影响(注意这里的“直接”二字,第3节会说到),只会在工程属性配置属性-->C/C++-->预处理器加入相应的宏: 使用Unicode字符集 --