Time of Update: 2018-12-05
昨天要在視頻轉寄程式裡增加轉碼功能:就是將輸入(流/檔案)轉碼成指定格式的視頻流和音頻流。研究了一下,發現vlc裡內建了轉碼功能,只不過參數設定比較麻煩。 我們具體的需求是:輸入:rtsp流或者udp組播資料(對設定轉碼參數來說,其實沒有區別)輸出:H264視頻(644k)+mp2音頻(56k),總碼率700k,ts封裝,使用udp轉寄到本地單播調用libvlc時的完整轉碼參數為: sendudp =
Time of Update: 2018-12-05
開始閱讀MonitorServer的原始碼,記錄一些心得。 從main函數入手,開始幾行代碼如下:1 struct sigaction sa;2 sa.sa_handler = SIG_IGN;3 sigaction( SIGPIPE, &sa, 0);以前沒用過,不知道為什麼遙忽略SIGPIPE訊號,於是搜尋之,解釋如下:在linux下寫socket的程式的時候,如果嘗試send到一個disconnected
Time of Update: 2018-12-05
#include "common.h"#include "CIniFile.h"#include "CRecordCfg.h"#include "CFileFactory.h"#include "CCtrlThread.h"#include "CThread.h"#include "CDeleteThread.h"#include "CSendFileinfoThread.h"#include "CConfigExt.h"#include "CUtil.h"#include
Time of Update: 2018-12-05
公司來了新伺服器(64位系統),將項目從原來的伺服器(32位)上遷移過去後,編譯出錯:g++ -shared -o dist/Debug/GNU-Linux-x86/libGeoFlock.so -fPIC build/Debug/GNU-Linux-x86/GeoFlock.o build/Debug/GNU-Linux-x86/library.o build/Debug/GNU-Linux-x86/GeoCrawler.o
Time of Update: 2018-12-05
昨天在客戶現場部署一套錄製時,遇到一個小問題,且記錄下來。系統啟動後,日誌會警示: statfs error. strPath:/figure/datafile/recordfile5/FullRecord/StreamTS/1-1-東方衛視, Value too large for defined data type RepeatCount=34 經查問題如下:(1)我們的系統開啟了一個線程,不斷的掃描系統磁碟的使用方式。使用的是系統調用 statfs();struct statfs {
Time of Update: 2018-12-05
今天在項目中查看pthread_create()函數的手冊時,居然報沒有該手冊頁:1 chu@chu-laptop/monitor-center-cs$ man pthread_create2 沒有 pthread_create 的手冊頁條目 搜尋了一下,是要安裝一個包:“manpages-posix-dev”1 chu@chu-laptop:monitor-center-cs$ sudo apt-get install manpages-posix-dev
Time of Update: 2018-12-05
剛才查看select調用的資料時,發現網上這麼一種用法,且記下來: 1 //Socket伺服器端,在一個死迴圈中的代碼: 2 nsock = accept(sock, (struct sockaddr *)&sin, &len); 3 iFlag = fcntl(nsock, F_GETFL); 4 iFlag |= O_NONBLOCK; 5 alarm(2); 6 fcntl(nsock, F_SETFL, iFlag); 7 alarm(0); 8
Time of Update: 2018-12-05
情境:有類crawler,以及它的對象 _pService。crawler類中聲明了兩個boost thread成員變數:1 boost::thread m_workThrd;2 boost::thread
Time of Update: 2018-12-05
昨天將項目代碼放在Fedora Core8上面編譯時間,g++報錯:xxx.c:1: 錯誤: 程式中有游離的‘\357’xxx:1: 錯誤: 程式中有游離的‘\273’xxx.c:1: 錯誤: 程式中有游離的‘\277’ 而之前在Fedora Core12上面編譯都沒問題, 於是搜尋了一下,發現是檔案編碼的問題:這是由於該檔案是以UTF-8 BOM的形式儲存的,而所用的編譯器不支援這種格式。 http://blog.csdn.net/hunhunzi/article/details/67104
Time of Update: 2018-12-05
在cu上看到一種測試大小端的方法,且記下來:核心中摳出來的一個測試大小端的程式,非常好,而且簡練。核心的技巧真是無處不再阿. /* *author:qqbsd *email:qqbsd.zhou@gmail.com */ #include stdio.h> static union { char c[4]; unsigned long l; } endian_test = { {'l','?','?','b'} }; #define ENDIANNESS
Time of Update: 2018-12-05
netbeans中添加依賴庫時,有幾種類型,一直不太明白他們的區別: 我們用pkgonfig庫添加了kyotocabinet,最終在makefile中產生了編譯選項:`pkg-config --libs kyotocabinet`。下面來研究一下:(1)整個命令用了``,應該表示將``中命令執行的結果傳給makefile,在shell中這樣的,這裡應該也差不多;(2)pkg-config是shell命令,具體介紹如下:1.什麼是configure
Time of Update: 2018-12-05
今天繼續完成視頻轉寄工具,使用udp監聽本地的8003連接埠,接收使用者發送的視頻轉寄請求。程式完成了,自己寫個小工具類比資料請求,來測試程式是否正常工作。這時候,出問題了。 測試步驟:(1)在虛擬機器(Fecdora Core12)裡運行程式(2)在主機裡使用工具發送類比請求(3)查看程式是否正常工作但是,結果是:虛擬機器Fecord Core12裡監聽的socket一直無法接收到主機發送的udp資料包,使用lsof -i查看,程式確實開啟了監聽連接埠:[root@chu xsock]#
Time of Update: 2018-12-05
Debian預設不允許root登入,所以修改之。(1)讓Debian以root登入修改gdm3的登入pam檔案#vi /etc/pam.d/gdm3將auth required pam_succeed_if.so user != root quiet_success注釋掉 //本行前加#重啟即可(2)讓Debian以root自動登入。首先修改gdm3的設定檔案#vi /etc/gdm3/deamon.confAutomaticLogin = false
Time of Update: 2018-12-05
有如下結構體: 1 typedef struct _client_msg 2 { 3 _client_msg(int clientID, int msgValue) 4 { 5 this->clientID = clientID; 6 this->msgValue = msgValue; 7 } 8 9 int clientID;10 int msgValue;11
Time of Update: 2018-12-05
項目中實現了checksum服務,看了下實現,用的是openssl庫中的hash演算法。很簡單的一個實現如下: 1 std::string ChecksumImplement::SHA1(const std::string & str) 2 { 3 unsigned char sha1_digest[SHA1_DIGEST_LENGTH] = {0}; 4
Time of Update: 2018-12-05
要做一個視頻轉寄的小工具,使用netbeans建好工程後,需要使用其他項目中使用的一些基礎類,於是使用“從檔案夾中添加現有項”功能,將需要的源檔案和標頭檔成功添加到項目中。但是在編譯項目時,由於這些匯入的檔案沒有被添加到Makefile中,沒有被編譯成目標檔案,在串連時會報錯:1 build/Debug/GNU-Linux-x86/main.o: In function `main':2 VideoTransmit/main.cpp:17: undefined reference to
Time of Update: 2018-12-05
項目中用到了vector,list,set等容器,運行完畢後需要清理,以釋放記憶體以降低記憶體開銷。一開始我直接使用clear()函數來釋放,實際觀察下來,記憶體並沒有被釋放。 經同事提醒,clear()並不能釋放記憶體,需要使用swap來釋放。於是查了一下,找到以下資料:vector與deque不同,其記憶體佔用空間只會增長,不會減小。比如你首先分配了10,000個位元組,然後erase掉後面9,999個,則雖然有效元素只有一個,但是記憶體佔用仍為10,000個。所有空間在vector析構時回
Time of Update: 2018-12-05
上周,項目裡需要一個視頻轉寄工具,我用libvlc完成了一個,大致流程如下:(1)主進程監聽指定連接埠,接收轉寄請求;(2)驗證請求合法性後,主進程fork一個子進程,在子進程中啟動vlc進行轉寄。 但調試時發現了一個小問題:fork出子進程後,在父進程中沒有調用waitpid,在子進程退出後, 父進程沒有為它“收屍”。於是乎,子進程雖然退出了,但進程號在系統曆仍然存在,變成了臭名昭著的“殭屍進程”。問題的根源在於:父進程沒有調用waitpid來監測子進程的活動狀況,關於waitpid能幹什麼,
Time of Update: 2018-12-05
項目中需要將原有的id統一改為uuid,於是直接用boost中的uuid庫來產生uuid。但在測試中發現程式效能嚴重下降,原來每分鐘能處理60萬條資料,使用uuid後只能處理2萬條左右。於是跟蹤之,先看我們的實現方式:1 static std::string uuid()2 {3 boost::uuids::uuid uuid = boost::uuids::random_generator()();4 return
Time of Update: 2018-12-05
在項目中需要實現pause/resume功能,用boost::condition實現大致如下:1 class Geo2 {3 ...4 bool m_bPauseFlag;5 boost::condition m_pause_cond;6 boost::mutex m_pause_mutex;7 boost::mutex m_pauseflag_mutex;8 9 }實現: 1 void Geor::pause() 2 { 3 LOG_DEBUG(