Menu Home

Android使用MediaPlayer播放视频步骤

MediaPlayer状态变换图: public class MainActivity extends Activity { Display display; SurfaceHolder surfaceHolder; SurfaceView surfaceView; MediaPlayer mediaPlayer; // 视频宽高 int width = 0; int height = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); display = getWindowManager().getDefaultDisplay(); String file = Environment.getExternalStorageDirectory() .getAbsolutePath() + “/Movies/1.m4v”; surfaceView = (SurfaceView) findViewById(R.id.sv); surfaceHolder = surfaceView.getHolder(); […]

编译ffmpeg使支持PIPE输入

查看ffmpeg支持的输入协议 ./configure –list-protocols 可能的输出: applehttp httpproxy rtmp bluray https rtmpe cache librtmp rtmps concat librtmpe rtmpt crypto librtmps rtmpte ffrtmpcrypt librtmpt rtmpts ffrtmphttp librtmpte rtp file md5 sctp gopher mmsh tcp hls mmst tls http pipe udp 增加PIPE支持 ./configure –enable-protocol=pipe 一个完整的编译参数 ./configure –enable-libmp3lame –enable-vdpau –enable-libx264 –enable-gpl –disable-static –enable-shared –disable-armv5te –disable-armv6 […]

linux c 使用socket处理HTTP请求

#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/select.h> #define BUFSIZE 4096 int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; charhttpRequest[BUFSIZE], buf[BUFSIZE]; bzero(httpRequest, sizeof(httpRequest)); //构建请求信息,这里请求http://192.168.2.184:8090/test.flv,这是一个由ffserver搭建的流媒体服务 strcat(httpRequest, “GET /test.flv HTTP/1.1\n”); strcat(httpRequest, “Host: 192.168.2.184:8090\n”); strcat(httpRequest, “User-Agent: Mozilla/5.0 (X11; […]

linux网络编程: AF_INET, AF_INET6, AF_UNSPEC

int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; socklen_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; ai_family参数指定调用者期待返回的套接口地址结构的类型。 它的值包括三种: AF_INET: 函数返回IPV4相关的地址信息 AF_INET6: 函数返回IPV6相关的地址信息 AF_UNSPEC: 函数返回的是适用于指定主机名和服务名且适合任何协议族的地址 如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回。 ref: http://blog.sina.com.cn/s/blog_8184e033010134c4.html

Android使用MediaRecorder录音

MediaRecorder状态流程 MediaRecorder输出格式 格式 描述 AAC_ADTS AAC ADTS格式 AMR_NB 自适应多速率窄带格式 AMR_WB 新型可变速率多模式宽带格式 DEFAULT MPEG_4 MPRG-4文件格式 RAW_AMR 不使用任何容器的原始文件,这个选项不适合有视频的录制文件,而且音频编码器是AMR_NB时才有效 THREE_GPP 3GP格式 MediaRecorder编码格式 格式 描述 AAC AAC Low Complexity (AAC-LC) audio codec HE_AAC High Efficiency AAC (HE-AAC) audio codec AAC_ELD Enhanced Low Delay AAC (AAC-ELD) audio codec AMR_NB AMR (Narrowband) audio codec AMR_WB AMR […]

ffmpeg常用命令

把mpg文件转换成一系列JPG图片 ffmpeg -i video.mpg image%d.jpg 其他支持的格式: PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI … MP4转换MOV 这里只是转换了包装格式,不改变视频和音频编码格式。 -vcodec copy:拷贝源视频编码格式 -acodec copy:拷贝源音频编码格式 ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy output.mov 其它常用参数: -s:设置视频大小 ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy -s 1920×1080 output.mov -r:设置视频帧率 ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy […]

jsoncpp的简单使用

OS:ubuntu 12.04 JSONCPP : 0.5.0 关于JSONCPP JSONCPP是一个比较流行的C/C++用来解析json的库,最新的版本是0.5.0,源代码下载地址点击 这里 JSONCPP的编译需要使用scons(ubuntu的用户直接apt-get install scons即可),编译成功后会在jsoncpp-src-0.5.0/libs/linux-gcc-4.7/ 下生成一个libjson_linux-gcc-4.7_libmt.so,开发头文件在include文件夹下。在编译自己的项目时需要加入-ljson_linux-gcc-4.7_libmt编译参数。 JSON结构 Value String Number Object json中的object是“名称/值”对的无序集合,类似于STL中的map。一个object以左大括号'{‘开始,右大括号结束’}’,名称和值之间使用冒号’:’分割,“名称/值”对与“名称/值”对之间使用逗号’,’分割。object可以被嵌套,可以作为其他类型的子元素。 一些例子: {“id” : 1} {“id” : 1, “name” : “lnmcc”, “age” : 100} Array json中的数组,以左方括号'[‘开始,右方括号’]’结束,元素跟元素之间以逗号’,’分割。 一个例子: { “teacher” : [ {“name” : “lnmcc”}, {“name” : “word”} ] } 使用JSONCPP解析json文件 文件test.json内容: { “id”:7, […]

Linux线程的调度策略与优先级

调度策略有3种: SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。 SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。 SCHED_RR: 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。保证了所有具有相同优先级的RR任务的调度公平此策略可设置线程优先级。 这3个宏在 sched.h 中定义。 线程优先级: 不同操作系统的优先级范围是不相同的,所以在设置线程优先级的时候需要先使用下面2个函数来查询其最大值和最小值: int sched_get_priority_max(int policy); int sched_get_priority_min(int policy); 参数policy是上面介绍的调度策略中的SCHED_FILO或SCHED_RR,注意不能是SCHED_OTHER,因为SCHED_OTHER不支持优先级。 查询和设置调度策略: int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param); 查询和设置线程优先级: 查询: struct sched_param param; //首先查询线程的调度策略,赋给param //参数attr是create线程时所使用的线程属性 pthread_attr_getschedparam(attr, &param); //从sched_param结构中获取线程优先级 param.__sched_priority; 设置: pthread_attr attr; struct sched_param param; […]

ubuntu使用Fn调节屏幕亮度

OS: ubuntu 12.04 NVIDIA: 319.37 笔记本在ubuntu下更新了NVIDIA显卡驱动后,Fn快捷键调节屏幕亮度的功能失效了,可以使用下面的方法重新启用: 在 /etc/X11/xorg.conf的”Device”段加入一行: Option “RegistryDwords” “EnableBrightnessControl=1” 现在xorg.conf看起来可能是这样: Section “Device” Identifier “Device0” Driver “nvidia” VendorName “NVIDIA Corporation” Option “RegistryDwords” “EnableBrightnessControl=1” EndSection

MediaPlayer(一)——处理网络音频文件

Android MediaPlayer状态转换图 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <TextView android:id=”@+id/TV01″ android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Status :” /> <TextView android:id=”@+id/statusTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Unknown” /> <TextView android:id=”@+id/bufferPercentTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Buffer Percentage : ” /> <ProgressBar android:id=”@+id/bufferSB” android:layout_width=”fill_parent” android:layout_height=”wrap_content” style=”@android:style/Widget.ProgressBar.Horizontal” android:max=”100″ /> <Button android:id=”@+id/startBtn” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Start” /> <Button android:id=”@+id/stopBtn” android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

android音乐文件搜索和播放

main_activity.xml <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <Button android:id=”@+id/returnBtn” android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”return” /> <!– 如果在代码中需要使用simple_list_item布局,那么这里的id必须为list –> <ListView android:id=”@android:id/list” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </LinearLayout> Main_activity.java public class MainActivity extends ListActivity implements LoaderCallbacks<Cursor> { //设置俩种选项状态:选择专辑或者选择歌曲 public static int STATE_SELECT_ALBUM = 0; public static int STATE_SELECT_SONG = 1; //默认当前状态为选择专辑 int currentState = […]

Android使用多点触摸(二)——绘图板

activity_main.xml <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.MainActivity” > <ImageView android:id=”@+id/imageView” android:layout_width=”fill_parent” android:layout_height=”fill_parent” /> </RelativeLayout> MainAvtivity.java public class MainActivity extends Activity implements OnTouchListener{ ImageView imageView; Bitmap bitmap; Canvas canvas; Paint paint; float startx = 0f; float starty = 0f; float endx = 0f; float endy = 0f; […]

repo 1.12.4 gpg key错误

自从repo升级到 1.12.4后,repo init的时候就一直报错: repo 1.12.4 gpg: Signature made Wed Oct 2 00:44:27 2013 CST using RSA key ID 692B382C gpg: Can’t check signature: public key not found error: could not verify the tag ‘v1.12.4’ 查了半天原来是android doc没有更新,解决方法是不要使用 curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo 下载的repo,使用下面的网址即可: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

Android Activity布局(layout)介绍

LinearLayout LinearLayout——线性布局,顾名思义,LinearLayout中的组件按照线性排列,每一个组件都位于前一个组件的后面。LinearLayout又可以分为水平线性布局和垂直线性布局。 垂直线性布局 在垂直线性布局中,组件从上至下依次排列。可以使用android:layout_weight属性来控制组件占据空间的比例:当layout_width或layout_height设置为0dp的时候,数值越高占据的比例越大;当layout_width或layout_height设置为match_parent时,数值越高占据的比例越小。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” > <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”2″ android:text=”TextView 1″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 2″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 3″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”TextView 4″ /> 水平线性布局 水平线性布局中的组件按照水平方向平铺排列,组件所占空间的比例跟layout_weight的值成正比。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”horizontal” > <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

Android Use Camera (一) : 捕捉图像并修改图像属性

git clone https://github.com/lnmcc/CameraExample.git 下面的例子将展示如何通过Camera Intent捕捉图像并修改图像属性的方法。 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <ImageView android:id=”@+id/imgView” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/TitleTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Title” /> <EditText android:id=”@+id/TitleET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/DescriptionTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Description” /> <EditText android:id=”@+id/DescriptionET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <Button android:id=”@+id/TakePictureBT” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Take Picture” /> <Button android:id=”@+id/SaveDataBT” […]

MAC OS 利用WIFI共享网络

MAC OS : 10.7.5 应用情景: 华为3G网卡负责外网,利用本机的wifi为其他设备提供共享网络。 打开系统 System Preferences界面,找到Sharing项     Sharing配置界面左侧选择Internet Sharing,只选中,不要打勾。在界面右侧的”Share your connection from”的下拉菜单中选择你需要共享的外网连接(我这里是HUAWEIMobile),然后在”To computers using:”下拉菜单中选择你用来发送共享网络的设备(我这里是Wi-Fi)     在左侧栏的”Internet Sharing”复选框中打勾,弹出下面的对话框后点击”Start”     完成后的状态

让人目瞪口呆的三位世界级电脑大师

公元1998年 在我读高二那年,那还是我用Windows 98的时候有次我系统崩溃了, 因为我那时还是个电脑白痴,我同学帮我介绍了一个电脑高手来帮我修电脑。 他看了一下电脑,问我有没有Windows 98 的光盘?我说没有。 他想了一下,叫我把家里电话拿给他,我心里想说修电脑要电话干什么? 但人家是电脑高手,我也不好意思说什么,就把电话拔下来给他了。 他把电话线空着的一头接在主机版的一个插孔内,然后进入了 DOS, 然后就开始在电话上不停的按着键,他按键的速度非常快,但是他都只按电话的0,1两个键。 我搞不懂这有什么用? 但也不敢问,看了半个多小时,他还是不停的按这两个键。 我渐渐的有些困,我问他这东西要搞多久? 他说还要几个小时,我给他倒了杯咖啡,就一个人去隔壁书房睡觉了。 醒来的时候,一看已经过了5个多小时,我起身到隔壁,看见他正在 Windows 98 里面调试。 过了一会儿,他说,你试试,我坐上椅子用了一下,真的好了。 我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了一些概念才了解到, 原来当时那位电脑高手是使用机器语言编了一个Windows 98系统从我给他的电话直接输入到硬盘。 我后来问我同学那位高手的下落,我同学说前几年去了美国之后,杳无音讯…. 公元2000年 在我读大一那年,那还是我用Windows Me的时候有次我系统崩溃了, 因为我那时还是个电脑入门,我朋友帮我介绍了一个电脑高手来帮我修电脑。 他看了一下电脑,问我有没有Windows Me 的安装盘?我说没有。 他想了一下,叫我把一张空的DVD刻录盘和一根奈米细针拿给他, 我心里想说修电脑要刻录盘和奈米细针干什么?但人家是电脑高手,我也不好意思说什么。 於是我就把DVD刻录盘拿一张来给他了。 他把奈米细针头对着刻录盘戳,他戳的速度非常快,但是只戳深或浅。 我搞不懂这有什么用?但也不敢问,看了半个多小时,他还是不停的戳着DVD刻录盘。 我渐渐的有些困,我问他这东西要搞多久?他说要几个小时,我给他倒了杯葡萄酒, 就一个人去隔壁客厅沙发上睡觉了。 醒来的时候,一看已经过了6个多小时,我起身到隔壁,看见他正在 Windows Me 里面调试, 还装上了 Office、Photoshop、迅雷、魔兽世界等软件……过了一会儿他说, 你试试,我坐上椅子用了一下,真的好了。 我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了一些基础,终于明白了,原来当时那位电脑高手是用奈米细针头刻了一个单面双层的DVD , […]

adb常用命令

设置标准输出和标准错误输出 Android系统默认把标准输出和标准错误输出(system.out和system.err)定向到/dev/null。使用下面的命令更改: $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 查看内存分配情况 $ adb shell dumpsys meminfo <package name> 重新安装apk adb install -r 包名 卸载apk adb uninstal 包名 注意这里的参数是包名,即AndroidManifest中package的属性值。

使用Android接口描述语言(AIDL)

AIDL简介 Andorid提供了一种轻量级的进程间通信机制:接口描述语言(Android Interface Definition Language),简称AIDL。进程间使用AIDL通信跟使用Intent通信的最大区别在于:前者是同步通信,而后者是异步通信。AIDL的语法与JAVA中的Interface十分相似,对数据类型的支持方面有一些差别,目前AIDL支持的数据类型有: Java中的基本数据类型 String List CharSequence Map 其他AIDL生成的接口 实现了Parcelable接口并通过值传递的自定义类型 使用AIDL的步骤 创建.aidl文件,在文件中声明远程服务的接口 在.java文件中实现.aidl中声明的方法 在AndroidMainifest中注册上面创建的服务 客户端请求绑定服务成功后就可以调用.aidl中声明的方法了 示例解析 项目目录结构: 在项目src文件夹下创建IAddService.aidl文件,在aidl声明了一个addOne方法,这个方法简单的把传入的值加上一。 IAddService.aidl: package net.lnmcc.aidltest.aidl; interface IAddOneService { int addOne(int value); } 保存.aidl文件后,Eclipse将会自动在gen/文件夹下生成一个IAddService.java文件,在后面实现远程服务的时候会使用到其中的抽象类Stub。 创建AddService,AddService是一个bound服务,需要实现onBind()方法,它将返回一个IAddService.Stub实例。IBinder简单的理解成进程间通信的通道,可以通过这个通道来实现数据传输。 AddService.java: public class AddService extends Service { IAddService.Stub mBinder; @Override public void onCreate() { super.onCreate(); mBinder = new […]