程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 攝像實時監控編寫過程

攝像實時監控編寫過程

編輯:關於C語言

  這真是個難搞的東西,非常的郁悶,基本二分鐘一個問題,哎,不知道是太菜了,還是這流媒體太難搞了,反正以後打死不想搞這個。碰到的問題一堆一堆的,先記錄下碰到的問題吧,一步一步來:

   1.error LNK2019:無法解析的外部符號,一看鏈接錯誤,感覺文件都添加了呀,仔細一看,使用了的函數只聲明了,沒有實現,加上,繼續,還是有問題,找來找去,半天沒頭緒,對比了下沒出錯的文件,好像少了個extern "C",把這文件一加,好了,我勒個去,C/C++混編害死人啊,但是出現這個錯誤肯定是你工程沒包含頭文件,要麼是函數沒有定義,或者沒有導入庫,最後試試extern.        

 2.添加自己的視頻捕捉類,需要添加庫文件,common文件,sdk_dll文件,av2000SDK.dll到當前目錄中,包含都不行,還要添加到工程中,我去。

   3.如果出現error C2664: “LoadLibraryW”: 不能將參數 1 從“const char [14]”轉換為“LPCWSTR”這樣的錯誤,就是工程開戶了多字符,在項目屬性/配置屬性/常規/項目默認值/字符集中修改成不使用Unicode。

   4.編譯ffmpeg之後,解碼jpeg文件, 使用ffmpeg -i 1.jpg 1.yuv  轉換之後生成了yuv420文件,但是用vlc打開老是花屏,我去,解決不了,沒人教真困難,還以為是轉碼不正確,心已經死了,真心難搞,後來問了師兄後,說yuv420有它固定的存儲方式, 需要用特定的工具打開才行,來希望了,馬上找了個,果真圖片出來了,終於走對了一步了,哎,但後面太漫長了,變成420後需要 把內存中的jpeg解碼,然後在編碼成264,最後利用live555轉發出去,任何一步出現問題都不會出畫面,今天就先記錄到這,明天繼續奮斗,實時更新。NND的。


今天挺高興的,這二天碰到的難題都解決了,竟然是一個人找資料搞出來的,我都佩服我自己了,呵呵,先自己贊一個

好了,把做流媒體近半個月來的過程和碰到的問題記錄下來,自己弄真的很困難,我其實也是找了相關的群,問了的,要不然,肯定早做不下去了,主要還是堅持,這裡鼓勵下大家。

   好了,接上次,在用ffmpeg把jpg的視頻流解碼後就要開始編碼成264了,這裡264編碼需要編譯libx264的庫文件,編譯過程中好像沒有碰到什麼困難,但它好像需要yuv420的,聽人家說ffmpeg解碼後出來的是422,然後我又花了一天的時間去找yuv422轉420的,本來用ffmpeg的sws_scale就是用來轉碼的,但我的程序總運行到這就崩潰,我是參照的網上例子,實在找不出問題,又沒人肯說和指導下,要放棄了,最後問的群裡一哥們,是不是把數據源搞錯了,你在去看看網上對數據源的說明,後來一看說明,YUV的要用到三個通道,而我參照的這例子只用到了一個通道,他的是RGB24,我的是YUV,後來改成這樣:

/*ctx->pic_src.data[0] = (uint8_t *)pFrame->data[0];
    ctx->pic_src.data[1] = (uint8_t *)pFrame->data[1];
    ctx->pic_src.data[2] = (uint8_t *)pFrame->data[2];
    ctx->pic_src.data[3] = 0;
    ctx->pic_src.linesize[0] = pFrame->linesize[0];
    ctx->pic_src.linesize[1] = pFrame->linesize[1];
    ctx->pic_src.linesize[2] = pFrame->linesize[2];
    ctx->pic_src.linesize[3] = 0;
    int rs = sws_scale(ctx->sws, ctx->pic_src.data, ctx->pic_src.linesize,0, ctx->rows, ctx->pic_target.data, ctx->pic_target.linesize);

OK,好了,非常的興奮。呵呵,解決了一個。

這下可以安心的去把圖片編碼成264的了,而且這個問題也一直是導致我調用264壓縮函數x264_encoder_encode崩潰的原因,因為後面到這又崩潰了,有了前面的教訓,我知道肯定又是數據傳錯了,肯定數據不是420的,然後返回去把數據一更改,也就通了。

   這下全通了,但live555傳這個畫面還是黑的,而已運行一下之後又崩潰了,我勒個去,要瘋了,沒辦法,還是要找錯誤,應該在264編碼格式上有問題,因為總體下來大致的過程就是yuv420->264,然後live555發送264,我把YUV420寫成文件是沒問題的,所以問題就在264的編碼上了。把264寫到文件中,看了下,也是對的,我去,這回沒得改了,不應該啊,照常的崩潰,心死了,然後就漫無目標的看著代碼,忽然看到了一個數據釋放的地方,我剛拿到yuv420的數據,然後就調用av_free(pFrame),把這一貞給釋放掉了,感覺有點不對,然後就注釋起來,一運行,我滴個天啊,竟然圖像出來了,哭,心理那個滋味啊,不提多爽了,半個月來的成果,終於出來了,終於可以交貨了,但是出現內存洩漏了,每秒1M的速度開始增加,但這也不算什麼,只要能讓總監看到成果,後面的問題可以慢慢來。呵呵。

   寫了這麼多,總結下,裡面太多的問題其實是不了解造成的,因為沒那麼多的時間去給我慢慢看,老在那催,不了解的話,就要細心的去編程了,然後先要把總體的大致結構列出來,碰到什麼問題就解決什麼問題,在現在這個年代,基本上什麼問題都可以在網上找到答案.我的總體框架列出如下,大家可以參考下:

   從IP攝像機獲取一幀數據->用ffmpeg解碼->用ffmpeg轉換格式->用libx264編碼成264格式->live555把數據發送出去。

   這樣基本上一個實時的攝像機監控就完成了,後面剩下的就是優化工作了,呵呵。

   OK,文章就寫到這了,文筆不好,隨便寫寫,主要是大家多交流交流,不早了,下班閃人


本文出自 “西邊太陽” 博客,請務必保留此出處http://thgenius.blog.51cto.com/1042803/1284532

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved