海康威視SDK視頻錄制及強(qiáng)制I幀操作

一业崖、NET_DVR_SaveRealData方法

使用下面方法可以實(shí)現(xiàn)視頻錄像功能野芒。

    private HCNetSDK sdk = HCNetSDK.INSTANCE;
    sdk.NET_DVR_SaveRealData_V30(cameraInfo.getKey(), file.getPath() + "/" + fileName + ".mp4")

該方法有個(gè)問題,視頻可以錄制双炕,但是不能被前端頁面直接加載播放狞悲,因?yàn)橐曨l編碼格式問題,雖然可以用FFMPEG工具進(jìn)行格式轉(zhuǎn)化妇斤,但是引入第三方的庫(kù)摇锋,無疑會(huì)使代碼的維護(hù)性降低。

FFMPEG工具 地址 提取碼 zc14
使用FFmpeg進(jìn)行轉(zhuǎn)換的方法如下:

ffmpeg -i  in.mp4  out.mp4

該方法網(wǎng)絡(luò)上有大量的帖子趟济,我直接放連接過來乱投,可以自行前往學(xué)習(xí)
大牛博客地址

二、NET_DVR_SaveRealData_V30方法

這個(gè)方法是問呵瓯啵康的工程師得到的,跟航P蹋康的工程師交流還是挺美好的媳纬,工程師很耐心,直到自己的問題得到解答施掏,代碼測(cè)試通過钮惠,所以還是必須給點(diǎn)個(gè)贊。

附上該方法的SDK文檔

NET_DVR_SaveRealData_V30 SDK

按照SDK文檔的說明七芭,第二個(gè)參數(shù)傳2素挽,就可以了

  //預(yù)覽成功后 調(diào)用接口使視頻資源保存到文件中
     if (!sdk.NET_DVR_SaveRealData_V30(cameraInfo.getKey(), 2,file.getPath() + "/" + fileName + ".mp4")) {
         log.error("保存視頻文件到文件夾失敗 錯(cuò)誤碼為:  " + sdk.NET_DVR_GetLastError());
         logoutHIK(cameraInfo);
         return;
     }

到這里會(huì)發(fā)現(xiàn)一個(gè)問題,官方下載的SDK HCNetSDK.java文件中沒有NET_DVR_SaveRealData_V30這個(gè)方法狸驳,尷尬了预明。
這就是官方SDK的坑點(diǎn),SDK中有耙箍,但是HCNetSDK.java文件中沒有撰糠,好多同學(xué)可能都會(huì)懵一下,這里可以將SDK中的方法直接復(fù)制進(jìn)HCNetSDK.java文件即可辩昆。SDK是按照C語言來描述的阅酪,JAVA要做響應(yīng)的適配改變。

 boolean  NET_DVR_SaveRealData_V30(NativeLong lRealHandle,int STREAM_TYPE,String sFileName);

OK,到此視頻已經(jīng)可以存儲(chǔ)术辐,播放也正常砚尽,但是你又會(huì)發(fā)現(xiàn)一個(gè)新的問題,就是保存的視頻辉词,設(shè)定1分鐘必孤,但是只有51秒 ,52秒较屿,57秒等隧魄,就是沒有1分鐘的,甚至59秒的都很少隘蝎,如果要求不那么高還好购啄,到這里就可以結(jié)束了,如果要求的高嘱么,那就得做出處理了狮含。

三、強(qiáng)制I幀

這里面其實(shí)是有一個(gè) I幀的定義

錄像數(shù)據(jù)解碼播放必須從I幀開始曼振,而客戶端錄像的時(shí)候開始時(shí)間點(diǎn)不一定是I幀几迄,比如幀率25fps、I幀間隔100幀的情況下冰评,每4秒才一個(gè)I幀映胁,錄像播放可能存在1~4秒的延時(shí),所以錄像的時(shí)候可以強(qiáng)制設(shè)備生成一個(gè)I幀甲雅。
NET_DVR_MakeKeyFrame強(qiáng)制主碼流生成一個(gè)I幀解孙,NET_DVR_MakeKeyFrameSub強(qiáng)制子碼流生成一個(gè)I幀,z這兩個(gè)是老的接口抛人。
后來因?yàn)樵O(shè)備不只有主碼流和子碼流弛姜,還有三碼流、虛擬碼流等妖枚,因此增加了NET_DVR_RemoteControl(命令:NET_DVR_MAKE_I_FRAME)接口廷臼,兼容前面的兩個(gè)接口,輸入?yún)?shù)NET_DVR_I_FRAME中byStreamType表示碼流類型绝页。建議使用該接口荠商。

可以看到,如果I幀沒有到抒寂,也是不錄視頻的结啼,但是I幀一般會(huì)慢幾秒中,所以視頻長(zhǎng)度不夠自己配置的長(zhǎng)度

需要用到NET_DVR_RemoteControl 這個(gè)方法屈芜,會(huì)發(fā)現(xiàn) HCNetSDK.java文件中并沒有NET_DVR_RemoteControl 這個(gè)方法郊愧,繼續(xù)添加上朴译。

附上NET_DVR_RemoteControl 的SDK
NET_DVR_RemoteControl SDK

同樣,在 HCNetSDK.java文件中增加這個(gè)方法(根據(jù)java做了語法轉(zhuǎn)換属铁,如果不好轉(zhuǎn)眠寿,請(qǐng)參考原HCNetSDK.java文件中的數(shù)據(jù)類型)

 boolean NET_DVR_RemoteControl(NativeLong lUserID, int dwCommand, Pointer pointer, int dwInBufferSize);

官方SDK簡(jiǎn)直了,有些方法沒有焦蘑,就連結(jié)構(gòu)體也沒有盯拱,都需要自己新增,沒辦法例嘱,誰讓咱要用人家的產(chǎn)品么
lpInBuffer參數(shù)對(duì)應(yīng)結(jié)構(gòu)體 NET_DVR_I_FRAME
看SDK手冊(cè) NET_DVR_I_FRAME 結(jié)構(gòu)體的官方文檔

NET_DVR_I_FRAME SDK

//強(qiáng)制I幀參數(shù)結(jié)構(gòu)體狡逢。
public static class NET_DVR_I_FRAME extends Structure{
    public int dwSize;
    public byte[] sStreamID = new byte[32];  //流IDs    SDK 中對(duì)  STREAM_ID_LEN進(jìn)行了定義,賦值32
    public int dwChannel;//通道號(hào)
    public byte byStreamType; //碼流類型:0-主碼流拼卵,1-子碼流奢浑,2-碼流3,3-虛擬碼流腋腮,以此類推
    public byte[] byRes = new byte[63];  //保留雀彼,置為0    按照SDK要求進(jìn)行對(duì)應(yīng)賦值
}
//新建結(jié)構(gòu)體對(duì)象
        HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建結(jié)構(gòu)體對(duì)象
        netDvrIFrame.read();
        netDvrIFrame.dwChannel = 1;          //因?yàn)樯衔拇a中設(shè)置了通道號(hào),按照上文中的設(shè)置
        netDvrIFrame.byStreamType = 0;
        netDvrIFrame.dwSize = netDvrIFrame.size();
        netDvrIFrame.write();

        if(!sdk.NET_DVR_RemoteControl(cameraInfo.getUserId(),3402,netDvrIFrame.getPointer(),netDvrIFrame.dwSize)){
            log.error("強(qiáng)制I幀 錯(cuò)誤碼為:  " + sdk.NET_DVR_GetLastError());
        }

在每次錄像之前即寡,對(duì)I幀進(jìn)行強(qiáng)制設(shè)置徊哑,可以及時(shí)錄像,經(jīng)過測(cè)試基本上按照配置的時(shí)間進(jìn)行錄制聪富,比如1分鐘就是1分鐘莺丑,偶爾有59秒的情況,提到的問題已經(jīng)大大的修復(fù)了墩蔓。經(jīng)次一輪窒盐,對(duì)SDK的使用也有了更深的了解。自己踩過的坑钢拧,也記錄下來,也讓別人能很好的使用官方的SDK炕横。

最后附上程序源内,歡迎下載傳閱,另外還有悍莸睿康工程師給的有更全結(jié)構(gòu)體的HCNetSDK.java文件
百度網(wǎng)盤 鏈接:https://pan.baidu.com/s/1JEKvEnb5wTDtmNqlNsKvLg
提取碼:x4bj

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膜钓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卿嘲,更是在濱河造成了極大的恐慌颂斜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拾枣,死亡現(xiàn)場(chǎng)離奇詭異沃疮,居然都是意外死亡盒让,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門司蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑茄,“玉大人,你說我怎么就攤上這事俊啼》温疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵授帕,是天一觀的道長(zhǎng)同木。 經(jīng)常有香客問我,道長(zhǎng)跛十,這世上最難降的妖魔是什么彤路? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮偶器,結(jié)果婚禮上斩萌,老公的妹妹穿的比我還像新娘。我一直安慰自己屏轰,他們只是感情好颊郎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霎苗,像睡著了一般姆吭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唁盏,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天内狸,我揣著相機(jī)與錄音,去河邊找鬼厘擂。 笑死昆淡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刽严。 我是一名探鬼主播昂灵,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舞萄!你這毒婦竟也來了眨补?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤倒脓,失蹤者是張志新(化名)和其女友劉穎撑螺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崎弃,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甘晤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年含潘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片安皱。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡调鬓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酌伊,到底是詐尸還是另有隱情腾窝,我是刑警寧澤赁炎,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布狂巢,位于F島的核電站柬脸,受9級(jí)特大地震影響湘捎,放射性物質(zhì)發(fā)生泄漏囤官。R本人自食惡果不足惜哥力,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一掸哑、第九天 我趴在偏房一處隱蔽的房頂上張望窿撬。 院中可真熱鬧蔗草,春花似錦咒彤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至模叙,卻和暖如春歇拆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背范咨。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工故觅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渠啊。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓输吏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親替蛉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子评也,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 神奇呀,第一次寫博客坤邪。以前都是用word總結(jié)下來放在本地或者放在我的網(wǎng)站里面熙含,但是我那個(gè)小網(wǎng)站,哈哈誰去看嘛艇纺?沒人...
    wuzhuoyu閱讀 3,770評(píng)論 0 6
  • 用到的組件 1怎静、通過CocoaPods安裝 2邮弹、第三方類庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,604評(píng)論 1 180
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)蚓聘、插件腌乡、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)夜牡,但是人生放棄了冒險(xiǎn)与纽,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,041評(píng)論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,875評(píng)論 0 2