当前位置:  编程技术>移动开发
本页文章导读:
    ▪[转]java中byte变换int时为何与0xff进行与运算        [转]java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码public static String bytes2HexString(byte[] b) {  String ret = "";  for (int i = 0; i < b.length; i++) {   String hex = Integer.toHexString(b[ i.........
    ▪ 流媒体:筹建HTTP Live Streaming直播系统        流媒体:搭建HTTP Live Streaming直播系统   本文转载自:http://blog.csdn.net/nmgfrank/article/details/6955105     最近,需要将苹果的HTTP Live Streaming系统搭建起来。完全没有头绪,故第一步就是学习。 一.........
    ▪ 800*480分辨率得到533*320的奇怪有关问题       800*480分辨率得到533*320的奇怪问题 今天在跑一个程序的时候拿屏幕的size, 我的手机是800*480,但是通过下面的代码拿到的高度却是533*320, 后面google得知,需要加上<uses-sdk android:minSdkVersi.........

[1][转]java中byte变换int时为何与0xff进行与运算
    来源: 互联网  发布时间: 2014-02-18
[转]java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
  String ret = "";
  for (int i = 0; i < b.length; i++) {
   String hex = Integer.toHexString(b[ i ] & 0xFF);
   if (hex.length() == 1) {
    hex = '0' + hex;
   }
   ret += hex.toUpperCase();
  }
  return ret;
}
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:
        一个数如果是正,则它的反码与原码相同;
        一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法
       对于十进制数,从9得到5可用减法:
       9-4=5    因为4+6=10,我们可以将6作为4的补数
       改写为加法:
       9+6=15(去掉高位1,也就是减10)得到5.

       对于十六进制数,从c到5可用减法:
       c-7=5    因为7+9=16 将9作为7的补数
       改写为加法:
       c+9=15(去掉高位1,也就是减16)得到5.

    在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

    ⑴一个数为正,则它的原码、反码、补码相同
    ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
   
- 1的原码为                10000001
- 1的反码为                11111110
                                                   + 1
- 1的补码为                11111111

0的原码为                 00000000
0的反码为                 11111111(正零和负零的反码相同)
                                          +1
0的补码为               100000000(舍掉打头的1,正零和负零的补码相同)

Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。

----
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

    
[2] 流媒体:筹建HTTP Live Streaming直播系统
    来源: 互联网  发布时间: 2014-02-18
流媒体:搭建HTTP Live Streaming直播系统

 

本文转载自:http://blog.csdn.net/nmgfrank/article/details/6955105

 

 

最近,需要将苹果的HTTP Live Streaming系统搭建起来。完全没有头绪,故第一步就是学习。

一、学习资料

官网资料

1. http://developer.apple.com/resources/http-streaming/

具体的搭建方案

        使用segmenter将现成的视频文件分割,并生成列表文件。

1. http://blog.csdn.net/zhoujunming/article/details/6694730

2. http://blog.sina.com.cn/s/blog_6c13e14e0100r9b8.html

3. http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/

二、使用Helix Universal Server和Helix Producer搭建直播系统

             1. http://scrolls.bokecc.com/?p=207   

                    ““”

苹果没有官方的HLS直播服务器软件和客户端软件。其它第三方公司的产品有:
·  TVersity
·  Helix Universal Server
·  Wowza Media Server
·  VLC Media Player version 1.2
我采用Helix Universal Server和Helix Producer(客户端软件)进行了直播测试。
若要做针对iOS平台的直播,目前来看,只能采用此种方式。

                    ”“”     

                     因此我也选择使用Helix Universal Server和Helix Producer来搭建直播系统。

               2.  Helix Universal Server

                  (1)  下载与安装

                         http://www.realnetworks.com/helix/download-helix-products.aspx 

                         在官方页面下载Helix Universal Server与Helix Producer。

                         Windows系统下,软件的安装过程会有详细而明白的提示,十分方便,

                         Linux操作系统中,

                              将下载的tar.gz文件解压得到bin文件。执行bin文件。

                              1. 输入证书的路径,如果证书有效,就可以不断地按【enter】键将其读完。

                              2. 选择accept刚才阅读过的内容。

                              3. 然后程序会让你填写安装路径,默认为bin文件所在的文件夹。第一次安装时,

                               由于enter点得太快,跳过了这一步。于是不得不再安装一次!!

                              4. 输入用户名和密码。

                              剩下就没有太重要的内容了,凭着感觉安装即可。

                              安装结束后,进入安装目录,

                                    输入命令:sudo ./Bin/rmserver rmserver.cfg就可以将服务器运行起来。

                                    打开配置文件rmserver.cfg,找到管理端口,在我这里是<Var AdminPort="25567"/> 

                                    输入链接:http://localhost:25567/admin/index.html 就可以进入系统的管理页面。

                  (2)  官方文档

                        http://www.realnetworks.com/helix/download-helix-products.aspx

                        从上述链接对应的文章中,我们可以了解到如何搭建基于Helix Universal Server的系统,

                        其中,文章的第七章详细介绍了如何将

                        http://docs.real.com/docs/producer14/HelixProducer14.0.0_GettingStarted.pdf

                        上述链接对应的文章介绍了Helix Producer的使用方法。

                  3. 利用Helix Universal Server和Helix Producer在一台机器上搭建直播系统(winxp操作系统)。

                       (1) 安装 Helix Universal Server和Helix Producer,安装时均使用默认设置,另外 还要设置用户名和密码。

                       (2) 运行Server

 

  •  
    •  
      • 打开服务器自带的管理页面(Server Administrator)。
      • 选择Content Management  ->  Media Segmentation,  将Enable Segmentation的状态改为yes                        

 

                       (3) 运行Helix Producer。

 

  •  
    •  
      • 选中input标签,设置输入。选中USB/Capture Device,再选择相应的信号源。
      • 选中output标签,设置输出。点击面板上的加号(Add output),然后进行对两类参数进行设置。
                                            encoding settings:设定相应的格式以及视频流的平均码率,帧率等参数                                 

 

                                            output servers:设定编码后的数据发到哪个服务器上。主要有如下几个参数:

                                                                   Server Type(可能是producer向服务器传送数据的方式):Helix Push.

                                                                   Stream Name(数据流的名称,在客户端,可以通过这个名称向服务器请求相应的数据流):test.mp4。

                                                                   Server address(服务器地址,由于server在本地,我将这个值设定为127.0.0.1)。

                                                                   HTTP Server Port(服务器设定的HTTP端口,默认为80):80.

                                                                   Username,Password(Helix服务器在安装之初设置的用户名和密码)。

 

  •  
    •  
      • 点击“Start Job”, 如果start成功,说明producer已经连接到服务器并且开始传输数据。

                4. 观察直播系统中的文件。

                     (1) 通过链接http://127.0.0.1/m3ugen/broadcast/test.mp4可以获得.m3u8文件(类似于index文件)。

                     (2) 进入服务器管理页面,选择Content Management -> Content Browsing, 点击Browse Content链接,就可以看到服务器上

                             的挂载点,以及挂载点下的资源。选择iPhone挂载点,进入broadcast,,进入test.mp4就可以看到ts格式的片段文件。

 

                5.  播放。

 

                     (1) 在播放器(例如vlc)中输入地址  rtsp://127.0.0.1:554/broadcast/test.mp4, 可以看到直播的视频。

                     (2) 播放HTTP Streaming,使用苹果客户端(iPhone)

                             用safari运行脚本:

<html> 

    <head> 

 

   <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>

           </head> <body > 

    <body>

                    <center> <video src="/blog_article/SERVER_ADD_SERVER_PORT/m3ugen/broadcast/test.mp4" controls autoplay ></video> </center>

     </body> 

</html>

三、使用免费的产品搭建直播系统

     上述方案的不足就是Helix的产品只有试用版。想用正版就得花钱。

     1. 学习资料

       使用VLC+mediastreamsegmenter+apache搭建HTTP Live Streaming系统:

              http://www.unmht.org/memo/en_ipod_stream.html

                   http://jokru.org/apple-http-live-streaming-to-the-ipadiphone-w

         mediastreamsegmenter的使用方法:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/mediastreamsegmenter.1.html

         对于搭建HTTP Live Streaming系统,官方的说明资料:http://developer.apple.com/library/ios/#technotes/tn2224/_index.html

 

     2.工具的选择

         (1)视频信号的采集与编码。

                mediastreamsegmenter能够接收的数据:视奥频-》H264;音频-》AAC, 封装于ts流中,

           通过UDP传输(似乎是这些要求,具体细节我其实也不清楚)。

           下面开始寻找能够满足这个要求的工具。

                1)quicktime broadcaster   

                    broadcaster的下载地址:http://developer.apple.com/library/ios/#documentation/networkinginternet/conceptual/streamingmediaguide/Introduction/Introduction.html

                                     安装这个软件后,用它向mediastreamsegmenter喂数据,segmenter报错。因此,我认为(可能不对),

                           这个工具不能满足要求。

                       2) VLC

                           经过试验,使用VLC可以成功地向mediastreamsegmenter喂数据。因此我选择VLC作为视频、音频流的处理工具。

                (2)视频流的分片工具

                    使用苹果的mediastreasegmenter

                 ( 3 ) 服务器

                     apache

       3. 具体架设方案。

                (1) 视频、音频信号的采集与编码,使用rtsp协议将视频播放出去。

                              一台PC(ip地址为192.168.1.101),装备有摄像头,麦克风,安装有VLC.

                             1)打开vlc,,选择 媒体->打开捕获设备->捕获设备。点击播放。如果vlc能够成功将摄像头和麦克风捕获的信号显示出来,

                                就可以进行下一步。

                             2)在VLC中选择 媒体->串流->捕获设备,点击串流。接下来会弹出一个流输出设置窗口。

                                  在“目标”中,选择RTSP进行添加,接着数据端口号(默认5544)和路径(我设置为 /test)。

                                  在转码选项中,在“激活转码前打钩”,档案中,保持默认选项(Video-H264+AAC(MP4))。

                                  点击“串流”,这时,该PC机的5544端口就开始提供rtsp直播服务了。

                              3) 验证rtsp服务是否可用。

                                  打开一个新的VLC,选择  媒体->打开网络串流。输入rtsp://127.0.0.1:5544/test, 如果可以成功地看到摄像头捕获

                                  的影像,就说明rtsp服务是可用的。

                 (2)视频流的转码

                            一台mac(我测试用的的视频服务器都部署在这里,IP:192.168.1.109),安装有vlc.

                            由于mediastreamsegmenter不能直接读入rtsp服务器传来的数据流,所以我们需要对数据进行一定的变换。

                            1)找到应用程序vlc的地址(一般默认在/Applications/VLC.app/Contents/MacOS下),进入文件夹。

                            2)输入命令:

                                ./VLC --intf=dummy rtsp://192.168.1.101:5544/test  '--sout=#transcode{fps=25,vcodec=h264,venc=x264{aud,profile=baseline,level=30, keyint=30,bframes=0,ref=1,nocabac},acodec=mp3,ab=56,audio-sync,deinterlace}:duplicate{dst=udp{mux=ts,dst=127.0.0.1:8000,access=udp}}'

                                下面大致介绍一下这条命令:

 

  •  
    •  
      •  
        •  --intf=dummy   表示不显示VLC的窗口
        •  rtsp://192.168.1.101:5544/test 是vlc输入流的来源,也就是我们之前搭建的rtsp服务器。
        •  --sout, 通过这个选项 对输出进行具体的设置。
        •  ranscode{fps=25,vcodec=h264,venc=x264{aud,profile=baseline,level=30, keyint=30,bframes=0,ref=1,nocabac},acodec=mp3,ab=56,audio-sync,deinterlace}    这一行命令对于视频和音频的转码格式进行设置(视频和264,音频aac), 但一些参数还不是很明白。          
        • duplicate{dst=udp{mux=ts,dst=127.0.0.1:8000,access=udp}},将视频、音频流封装为ts格式,使用udp传输,传向本地服务器的8000端口。

 

                (3) 获取ts流并进行分片

                           1)medianstreamsegmenter

                                  这个小程序一般默认安装在mac的/usr/bin下。

                                  具体使用方法:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/mediastreamsegmenter.1.html

                            2)使用命令

                                  /usr/bin/mediastreamsegmenter  -s 3 -t 5 -D -f /usr/frank/stream 127.0.0.1:8000

                                  判断是否成功分片:如果终端显示 : Finalized 存储路径 file Sequencex.ts,则说明分片成功了。

                                  说明: 

                                               -s 3  设定index文件中记录几个分片。

                                               -t  5 设定多长时间(秒)产生一个分片,默认为10秒。

                                               -D 删除过期的分片文件

                                               -f /usr/frank/stream设置存储分片文件和index文件的文件夹

                                               127.0.0.1:8000 设置获取ts流的地址

                (4)使用apache提供服务.

                          第一次在mac下使用apache,难免会感到一丝生疏。学习资料:http://hi.baidu.com/hsbd2005/blog/item/7393a84f0017b5c7d1c86ad4.html

                          mac自带apache.

                          1) 启动

                              使用命令:sudo apachectl start, 然后在浏览器中数据localhost进行查看,如果看到It works,说明apache可以正常工作。

                          2) 配置文件

                              配置文件默认路径为 /etc/apache2/httpd.conf(对于文本的编辑,可以用 (vi 文件路径),也可以用(sudo open -a TextEdit.app 文件路径)).

                              可以看到 DocumentRoot  "/Library/WebServer/Documents",也就是说,这是存放资源的默认路径。

                           3) 进入 /Library/WebServer/Documents, 建立文件夹httpstream,

                               将mediastreamsegmenter的输出指向这里:  

                                           /usr/bin/mediastreamsegmenter  -s 3 -D -f /Library/WebServer/Documents/httpstream 127.0.0.1:8000

                              在浏览器中输入localhost/httpstream/prog_index.m3u8,如果能够看到分片文件的列表,就说明成功了一半。    

                           4) 写脚本文件,在Library/WebServer/Documents/下创建一个index.html文件,具体内容如下:

 

<html> 

    <head> 

 

   <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>

           </head> <body > 

    <body>

                    <center> <video src="/blog_article/192.168.1.109/httpstream/prog_index.m3u8" controls autoplay ></video> </center>

     </body> 

</html>

(5) 直播效果

           在safari中输入链接http://192.168.1.109/index.html,观看直播。   

            画质很差,可能是一些参数设得不够好。

 

 


    
[3] 800*480分辨率得到533*320的奇怪有关问题
    来源: 互联网  发布时间: 2014-02-18
800*480分辨率得到533*320的奇怪问题
今天在跑一个程序的时候拿屏幕的size, 我的手机是800*480,但是通过下面的代码拿到的高度却是533*320, 后面google得知,需要加上<uses-sdk android:minSdkVersion="4"/>才能拿到正确的值  fuck

引用
//定义DisplayMetrics对象
//DisplayMetrics 描述普通显示信息的结构,例如显示大小,密度,字体尺寸等
        DisplayMetrics dm=new DisplayMetrics();
/*
*获取手机窗口的Display来初始化DisplayMetrics对象
*getWindowManager() 获取显示定制窗口的管理器
*getDefaultDisplay() 获取默认显示Display对象
*getMetrics(dm) 通过Display对象的数据来初始化一个DisplayMetrics对象
*/
        getWindowManager().getDefaultDisplay().getMetrics(dm);
//得到屏幕宽高
        String showSize="手机屏幕分辨率:\n"+dm.widthPixels+"*"+dm.heightPixels;


        Log.v("SCREEN_SIZE", showSize);

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实用的代码片段 常用代码总结 iis7站长之家
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3