2016年1月12日

ffmpeg常用指令介紹

以下內容轉於 此處

ffmpeg下載點(微軟平台)

ffmpeg -formats:查看ffmpeg支援的格式
D=解碼,E=編碼

ffmpeg -i (檔案名稱):查看檔案資訊,如解析度、bitrate

mp4轉檔範例(windows):
ffmpeg -i will.MTS -s 640x480 -b:v 500k -vcodec libx264 -r 29.97 -acodec libvo_aacenc -b:a 48k -ac 2 -ar 44100 -profile:v baseline -level 3.0 -f mp4 -y will.mp4

mp4轉檔範例(linux):
ffmpeg -i (檔案) -s 640x480 -b 500k -vcodec libx264 -r 29.97 -acodec libfaac -ab 48k -ac 2 -ar 44100 -profile baseline -level 3.0 -f mp4 -y (新檔名).mp4

-i : 指輸入的檔案名稱
-f : 強迫輸出的檔案格式。
-s : 畫面的解析度,格式是 wxh
-b:指定影像的bitrate
-vcodec : 指定影像的編碼格式
-r : 設定fps。
-acodec : 指定聲音的編碼格式
-ab : 指定聲音的bitrate
-ac : 設定聲音的聲道數。1指是的單聲道
-ar : 指定聲音的取樣頻率,一般預設是44100
-profile:指定profile
-level:指定level
-f:強迫輸出格式
-y:若檔名重覆即不詢問直接覆蓋

wmv轉檔設定
-vcodec wmv2
-acodec wmav2

flv轉檔設定
-vcodec flv
-acodec libmp3lame

ffmpeg 影片切割
-ss 01:00:00 指定從01:00:00開始切割
-t 00:00:30 切割00:00:30秒

jpg基本擷圖範例
ffmpeg -i test.flv -an -ss 00:00:10 -y test.jpg

jpg進階擷圖範例
ffmpeg -i test.flv -an -ss 00:00:42 -r 10 -vframes 70 -y NolanRyan-%d.jpg
-i:影片名稱
-an:把音訊 audio 取消
-ss:00:00:42 從第 42 秒鐘開始擷取
-r:10 每秒抓10張圖 (單位是 Hz,所以這個值設得越高,每秒鐘抓出來的圖檔越多)
-vframes:70 總共要抓 70 張圖,與上面的 -r 10 搭配之下,表示要抓長達 70/10 = 7 秒鐘的影像,並轉換成圖檔。
-y %d.jpg:表示抓出來的圖檔副檔名為 jpg,而檔名 %d 表示圖檔檔名會以數字 digit 的型式自動編號。
(此例會存成 NolanRyan-1.jpg NolanRyan-2.jpg ... NolanRyan-70.jpg)

查詢電腦中影像或聲音擷取裝置的名稱for windows
ffmpeg -list_devices true -f dshow -i dummy

ffmpeg版encoder
ffmpeg.exe -r 29.97 -f dshow -s 640x480 -i video="USB 2.0 VGA UVC WebCam":audio="Microphone (Realtek High Defini" -vcodec libx264 -acodec libvo_aacenc -f flv rtmp://192.168.0.164/live/test

左右翻轉
ffmpeg -i foo.avi -vf hflip hflip.avi
上下翻轉
ffmpeg -i foo.avi -vf vflip vflip.avi
順時針旋轉 90 度
ffmpeg -i foo.avi -vf transpose=1 transpose.avi



以下參考資料來源於此


ffmpeg
一般用來作轉檔用途
參數說明:
-i : 輸入的檔案
-fromats :顯示可用的格式,編解碼的,協議的...
-f format : 轉出檔案的格式,例如:avi,mp4...
-target type :設置目標文件類型(vcd,svcd,dvd) 所有的格式選項(比特率,編解碼以及緩衝區大小)自動設置,只需要輸入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-vcodec codec :強制使用codec編解碼方式。如果用copy表示原始編解碼數據必須被拷貝
-sameq :使用同樣視頻質量作為源(VBR)
-pass n :選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-b bitrate : 輸出影像的位元率(bitrate),預設 = 200 kb/s,說明-bitrate通常是指數位音樂或者視訊的平均位元速率,可以簡單的認為等於檔案大小除以播放時間。例如常用的RMVB在壓縮電影時常常設定視訊平均位元速率為450kbps,則平均每秒佔用約55千位元組,這樣可以估算10分鐘的視訊大小約為55KB*60*10=33MB,2小時的視訊則約為400MB。碼率並不是衡量音訊/視訊質量的唯一標準,格式、影像大小、音訊取樣頻率、音訊解析度等因素也是很重要的指標。
-r fps  :  輸出影像的幀率(frame rate),預設為25
-s size :輸出影像的大小,例如:800x600...

-acodec codec :使用codec編解碼
-ab bitrate :輸出音訊的位元率(bitrate),預設 = 64K
-ar freq  :   輸出音訊的取樣頻率,預設 = 44100Hz
-ac channels :   輸出音訊的聲道數,1或2(Stereo)

-ss time: 開始轉檔的影片時間,單位(秒)
-t duration :片長

例如:
輸出純粹的YUV檔
ffmpeg -i mydivx.avi hugefile.yuv
播放YUV格式
./ffplay -s 1280x720 ../file.yuv
重點在於當初轉成YUV的影片大小要符合

./ffmpeg -i ../FF13.mp4 -f ffm -b 10000k -ab 64k -r 60 -ar 48000 -ac 2 -s hd720 ../file.ffm

2015年3月25日

Python3 使用 urllib 實例

http://uds.tw/page.php?i=51

( Python3 使用 urllib.request )
import urllib.request

fp = urllib.request.urlopen("http://www.python.org")

mybytes = fp.read()

mystr = mybytes.decode("utf8")

fp.close()


print(mystr)





2014年12月18日

(筆記) android的權限設定

很久以前找的資料,出處已經不可考了,不過這資料在網路上多到爆就是了

允許在登入數據庫的時候讀寫其中的屬性表,並上傳改變的值
android.permission.ACCESS_CHECKIN_PROPERTIES


允許應用訪問範圍(如WIFI)性的定位
android.permission.ACCESS_COARSE_LOCATION


允許應用訪問精確(如GPS)性的定位
android.permission.ACCESS_FINE_LOCATION


2014年11月28日

(筆記) android 實機檢視/data/data目錄


AndroidManifest.xml 的application標籤內加入android:debuggable="true"

adb shell中用 run-as com.yourapp
就可以進入進入/data/data

另外,書上說(以下尚未實踐過,不確定是否必要)
如果要用sqlite3 指令操作資料庫前要先(使用adb前)設定命令提示字元的編碼跟字形
chcp 65001
然後在控制台右鍵選內容把字形選 Lucida Console

如果執行上面的動作後,命令提示字元會變得很怪又調整不回來請依序下步驟
chcp 950
然後在標題右鍵選內容(不要選預設值)
設定 字型 點陣字體 8X16


如果加入了android:debuggable="true"發生
Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one
的錯誤可以參考這的資料解決(也不是解決,只不過是把問題藏起來啦...)


最後補充,這篇文章有詳細如何adb pull的資料

2014年11月27日

Eclipse 的 Content Assist



不論是開發JAVA或是寫android用Eclipse

首先要先設定的就是 Content Assist

提示功能太重要了,但是如果只是輸入到 "." 或是手動輸入 ALT+/ 來提示太沒效率了

Window -> Preferences -> Java/Editor/Content Assist

Auto Activation triggers for java 的內容由原本的 "." 修改成

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz =.(!+-*/~,[{@#$%^&

2014年11月26日

(筆記) Android 控制模擬器鍵盤按鍵




Android 控制模擬器鍵盤按鍵

Home Home鍵
Menu F2
Back ESC鍵
Call F3
Search F5
Power F7
音量增加Ctrl+F5
音量減少Crtl+F6
Camera Ctrl+F3

2014年9月25日

notepad++ 執行python

notepad++ "執行"選單填入

cmd /k python "$(FULL_CURRENT_PATH)" & PAUSE & EXIT

儲存

快速鍵設為 ctrl + F5

2014年3月12日

一個使用ROW_NUMBER()分頁的範例

因為老是會忘記,所以記錄一個範本好了(ps SQL 2005以上版本才可以用ROW_NUMBER)
SELECT  *
FROM (
SELECT  ROW_NUMBER() OVER (ORDER BY id) AS rid, * FROM t1 where name != '1'
) AS NewTable
WHERE rid >= 1 AND rid <= 5

2014年3月5日

一個python的socket實例 (Python3)

http://uds.tw/page.php?i=52

一個python的socket實例,我在這裡囑咐自己!!不要在忘記socket傳遞資料時都是以byte來進行的
print('server start...')
if __name__ == '__main__':  
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('127.0.0.1', 8001))  
    sock.listen(5)
    while True:  
        connection,address = sock.accept()
        try:
            connection.settimeout(5)
            buf = connection.recv(1024)
            print(buf.decode("utf-8"))
            s = "哇哈哈"
            connection.send(s.encode('utf-8'))
        except socket.timeout:
            print('time out')
        connection.close()




if __name__ == '__main__':  
    import socket  
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    sock.connect(('127.0.0.1', 8001))  

    sock.send('客戶端給伺服器端的訊息文字....'.encode('utf-8'))
    str = sock.recv(1024)
    print(str.decode("utf-8"))
    sock.close()  

2014年2月25日

java http連線與傳送資料範例

原文來源:http://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/
以下的範例我有稍微修改
-----------------------java-----------------------
package httppost;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class TestHttp {
 
 // HTTP GET request
 public void sendGet() throws Exception {
 
  String url = "http://127.0.0.1/test.php?id=中文字&pw=中文字";
 
  URL obj = new URL(url);
  HttpURLConnection con = (HttpURLConnection) obj.openConnection();
 

  con.setRequestMethod("GET");
 
  con.setRequestProperty("User-Agent", "Mozilla/5.0");
 
  int responseCode = con.getResponseCode();
  System.out.println("\nSending 'GET' request to URL : " + url);
  System.out.println("Response Code : " + responseCode);
 
  BufferedReader in = new BufferedReader(
          new InputStreamReader(con.getInputStream()));
  String inputLine;
  StringBuffer response = new StringBuffer();
 
  while ((inputLine = in.readLine()) != null) {
   response.append(inputLine);
  }
  in.close();

  System.out.println(response.toString());
 
 }


 // HTTP POST request
 private void sendPost() throws Exception {
 
  String url = "http://127.0.0.1/test.php";
  URL obj = new URL(url);
  HttpURLConnection con = (HttpURLConnection) obj.openConnection();
 

  con.setRequestMethod("POST");
  
  con.setRequestProperty("User-Agent", "Mozilla/5.0");
  con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
 
  String data = "id=UTF8中文字&pw=UTF8中文字";
 

  con.setDoOutput(true);
  DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  //wr.writeBytes(data);
  wr.write(data.getBytes("utf-8"));//為了傳送utf8的文字改成這個
  wr.flush();
  wr.close();
 
  int responseCode = con.getResponseCode();
  System.out.println("Sending 'POST' request to URL : " + url);
  System.out.println("Post parameters : " + data);
  System.out.println("Response Code : " + responseCode);
 
  BufferedReader in = new BufferedReader(
          new InputStreamReader(con.getInputStream()));
  String inputLine;
  StringBuffer response = new StringBuffer();
 
  while ((inputLine = in.readLine()) != null) {
   response.append(inputLine);
  }
  in.close();

  System.out.println(response.toString());
 
 }
 
 
 public static void main(String[] args) throws Exception {
   

  TestHttp testhttp = new TestHttp();
  testhttp.sendPost();
  testhttp.sendGet();
 }
}

-----------------------PHP-----------------------
if($_GET['id'] != '' && $_GET['pw'] != '')
{
 echo 'id=' . $_GET['id'] . ' pw=' . $_GET['pw'];
}


if($_POST['id'] != '' && $_POST['pw'] != '')
{
 echo 'id=' . $_POST['id'] . ' pw=' . $_POST['pw'];
}

補充 可以用這個來取得標頭
		//---------
		Map> header = con.getHeaderFields();
		for (Map.Entry> entry : header.entrySet()) {
		    String key = entry.getKey();
		    for (String value : entry.getValue()) {
		        System.out.println(key + ":" + value);
		    }
		}
		//---------

2013年10月28日

(筆記) Android SDK API Level

Code name Version API level
(no code name) 1.0 API level 1
(no code name) 1.1 API level 2
Cupcake 1.5 API level 3, NDK 1
Donut 1.6 API level 4, NDK 2
Eclair 2.0 API level 5
Eclair 2.0.1 API level 6
Eclair 2.1 API level 7, NDK 3
Froyo 2.2.x API level 8, NDK 4
Gingerbread 2.3 - 2.3.2 API level 9, NDK 5
Gingerbread 2.3.3 - 2.3.7 API level 10
Honeycomb 3.0 API level 11
Honeycomb 3.1 API level 12, NDK 6
Honeycomb 3.2.x API level 13
Ice Cream Sandwich 4.0.1 - 4.0.2 API level 14, NDK 7
Ice Cream Sandwich 4.0.3 - 4.0.4 API level 15, NDK 8
Jelly Bean 4.1.x API level 16
Jelly Bean 4.2.x API level 17

2013年10月2日

(筆記)C#抓取網頁

http://uds.tw/page.php?i=53

因為是很常用到的,所以紀錄一下
        private string GetWebContent(string Url)
        {
            string strResult = "";

            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.Timeout = 30000;
                request.Headers.Set("Pragma", "no-cache");
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream streamReceive = response.GetResponseStream();
                Encoding encoding = Encoding.GetEncoding("UTF-8");
                StreamReader streamReader = new StreamReader(streamReceive, encoding);
                strResult = streamReader.ReadToEnd();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            return strResult;
        }
來源我想不起來了,很久以前找到的範例

2013年9月23日

(書籍)現學現用!企劃書提案書72例

幾年來我承接許多案子,正常來說!說服客戶往往要下不少功夫,通常會在大約了解客戶需求後應該撰寫一份設計企劃書,而現實上則非如此,尤其是小型專案通常業主都並不是很了解專案流程或是相關知識不足,所以常常只要撰寫開發的規格書就足夠應付業主(當然這樣的情形僅限於專門承接中小行專案的設計工作室)。

不是我在自誇,我寫規格書相當快,因為畢竟程式寫久了很熟悉大多數客戶想要的,企劃書算是我比較薄弱的。

幾天前在中壢圖書館看到這本 現學現用!企劃書提案書72例 ISBN 9789861242095 相當不錯

---------------- 以下寫出我覺得很不錯的重點 ----------------

2013年8月28日

(筆記)android onTouchEvent 事件

在網路上找的範例,以下有稍微修改,因為原來源文添加了一些非必要的東西搞得太複雜 首先加入全域變數
float upX, upY, downX, downY;
以下是修正過的範本
 public boolean onTouchEvent(MotionEvent event) {
   
        float X = event.getX(); // 觸控的 X 軸位置
        float Y = event.getY(); // 觸控的 Y 軸位置
 
        switch (event.getAction()) { // 判斷觸控的動作
 
        case MotionEvent.ACTION_DOWN: // 按下
            downX = event.getX();
            downY = event.getY();
            Log.d("onTouchEvent-ACTION_DOWN","DOWN");
 
            return true;
        case MotionEvent.ACTION_MOVE: // 拖曳
 
            return true;
        case MotionEvent.ACTION_UP: // 放開
            Log.d("onTouchEvent-ACTION_UP","UP");
            upX = event.getX();
            upY = event.getY();
            float x=Math.abs(upX-downX);
            float y=Math.abs(upY-downY);
            double z=Math.sqrt(x*x+y*y);
            int jiaodu=Math.round((float)(Math.asin(y/z)/Math.PI*180));//角度
             
            if (upY < downY && jiaodu>45) {//上
                Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:上");
            }else if(upY > downY && jiaodu>45) {//下
                Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:下");
            }else if(upX < downX && jiaodu<=45) {//左
                Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:左");
            }else if(upX > downX && jiaodu<=45) {//右
                Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:右");
            }
            return true;
        }
 
        return super.onTouchEvent(event);
    }

2013年8月23日

(筆記)Android AlertDialog 交談視窗(3個按鈕)

   new AlertDialog.Builder(this).setTitle("你按下了:" + data[arg2])
     .setNegativeButton("取消",
       new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,
          int which) {
         Log.d("pbtwnet", "按下取消了");
        };
       })
     .setPositiveButton("確定",
       new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,
          int which) {
         Log.d("pbtwnet", "按下確定了");
        };
       })
     .setNeutralButton("忽略",
       new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog,
          int which) {
         Log.d("pbtwnet", "按下忽略了");
        };
       })
     .show();