[C/C++] SDL 與 FFMEPG 播放影片
SDL (Simple DirectMedia Layer) 和 FFmpeg (Fast Forward mepg) 是兩個獨立的函式庫,可以結合使用以實現視訊播放。
SDL (Simple DirectMedia Layer) 和 FFmpeg (Fast Forward mepg) 是兩個獨立的函式庫,可以結合使用以實現視訊播放。
想要實現 SDL 和 FFmpeg 非同步方式播放影片,涉及到在一個單獨的線程中解碼影片幀,並在主線程中更新 SDL 視窗。之後做到同時播放影片,還能偵測滑鼠點擊事件。
有時候在寫 C/C++ 程式,引用了某些 Library,編譯會出現錯誤,後來查找原因
FFmpeg 編譯: undefined reference to ‘av_frame_alloc()’
原來該 Library 是以純 C 寫的,需要以 extern "C"
來讓編譯器識別。
看來我真的對 C/C++ 不熟呢~😜
(繼續閱讀…)最近有個任務是寫回調函式 (Callback Function)。在寫 App 已經用過類似的機制,被包裝得相當容易使用。這次就來實現比較底層的作法。
在日常生活中,回調函式就像一個「代理人」。當你需要某人幫忙做一件事情,但你自己又不能做的時候,你就可以請一個「代理人」來幫你。
例如,你想去一個地方,但你不知道路。你可以請一個朋友來幫你帶路。在這個例子中,你的朋友就是你的「代理人」。
在程式設計中,回調函式也是一樣。當你需要某個函式在完成某些工作後通知你,但你自己又不能做的時候,你可以使用回調函式。
例如,你想下載一個文件。你可以使用一個函式來下載文件,並在下載完成後通知你。在這個例子中,下載文件的函式就是你的「代理人」。
以下是一些日常生活中的回調函式的例子:
在這些例子中,服務生、商家和銀行都扮演著「代理人」的角色。他們在完成某些工作後通知你。
(繼續閱讀…)在Swift剛釋出沒多久,我就研究過如何在同專案整合Objective C和Swift。文章:
儘管還是傾向以Objective C來開發產品,然而Swift的發展日趨重要,不過我大膽推測,就算Apple再怎麼強推Swift,十年內Objective C領導地位依然屹立不搖!為什麼呢?實際接觸4年Swift後,發現Swift變化多端,若猶豫要學Swift還是Objective C可以參考:要學Objective-C還是Swift?。
現在想要混編Objective C、Swift、C/C++,應也不是問題~
最近要讀取藍牙裝置回傳的資料來解析,需要將4 bytes轉成integer,才能知道訊號強度相對值。太久沒搞底層東東,有些生疏,好在嘗試一下就得到正確結果!
最近要整合C/C++高人寫的Source Code,發現我自己好像斷手斷腳XD,因為要搞較為底層的記憶體空間配置⋯⋯先前寫Objective C多麼愜意,用不到的記憶體空間,系統會自動去釋放,但是在C/C++就要自己寫code處理呢!
現在想要配置2D陣列 (Allocate 2D Array),要怎麼做才好辦事呢?
以後都來這兒複製貼上吧XD~
/** Theme: Allocate 2D Array IDE: Xcode 9 Language: C Date: 107/03/30 Author: HappyMan Blog: https://cg2010studio.com/ */ #include #include float** createArray(int m, int n) { float* values = calloc(m * n, sizeof(float)); float** rows = malloc(n * sizeof(float*)); for (int i = 0; i < n; ++i) { rows[i] = values + i*m; } return rows; } void destroyArray(float** arr) { free(*arr); free(arr); } int main() { float** happyArr = createArray(2,3); happyArr[0][0] = 1; happyArr[0][1] = 1; happyArr[1][0] = 2; happyArr[1][1] = 2; happyArr[2][0] = 3; happyArr[2][1] = 3; destroyArray(happyArr); return 0; }
我發現顯示code的外掛會讓下面兩行出問題~
#include <stdio.h>
#include <stdlib.h>
最後記得釋放記憶體唷~
最近要研究1992年程式高人寫的原始碼,看到Xcode上黃色驚嘆號標示說是非常早期的語法,好在還能編譯運作,不然要以目前C語法再刻一次,我真的會想去撞牆啊XD~
話說,我學生時代習慣用C++寫程式,現在想以C++來引用C標頭檔,雖然在Xcode中可以將.c改成.cpp,就能成功「騙」過編譯器,但那樣根本是多此一舉,明明是C語言還要宣示為C++語言。
查詢後原來很簡單如何引用C標頭檔,使用extern保留字標記C,大括號中就是引用C標頭檔。
高人解釋:
For a list of C standard C headers (stdio, stdlib, assert, …), prepend a c and remove the .h. For example stdio.h becomes cstdio.
For other headers, use
extern “C"
{
#include “happy_header.h"
}
因為串接藍芽裝置,想要從藍芽裝置獲得資訊或是傳送指令到藍芽裝置,需要瞭解其溝通協定,才能順利互通有無。
因為資料長度的關係,需要把資料型別短的組合成長的,如轉 uint8_t 為 uint16_t。
原始資料:
uint8_t d1 = 0x01;
uint8_t d2 = 0x07;
轉成:
uint16_t wd = 0x0701;
此時需要瞭解點位元操作,就能寫程式實現。
程式實作:
uint16_t wd = ((uint16_t)d2 << 8) | d1;
原理:
(0x0007 << 8) | 0x01 = 0x0700 | 0x0001 = 0x0701
意思是d1向左位移8位元,再和d2結合。
參考:Combining two uint8_t as uint16_t。
HappyMan・迴響