iphone上直接讀取YUV數據測試算法程序

搞視頻編碼算法的同學,大多數都是C語言高手,但對ios,android的編程語言比如object-c,java,ndk等卻一竅不通。讓算法的同學去學各個平臺的細節,又很浪費時間和精力。
另外,加載程序到手機上,讀取yuv數據進行編碼,獲取編碼後的碼流都不方便。以前android還可以打開調試模式的時候,還可以直接命令行調試,現在android手機不再支持調試,如何在手機上調試算法就成爲了一個難題。
本文介紹,如何在iPhone上開發C語言算法測試程序,直接讀取yuv,輸出視頻編碼或者其他算法處理後的數據。同時介紹如何利用iPhone的profile工具,對算法進行優化。

  1. 用c語言編寫可以在各個平臺的運行的算法
  2. 用c語言編寫在windows或Linux或mac上運行的測試程序
  3. 增加iPhone上對文件打開關閉的特殊處理:
    要點即:
    a. 編輯程序的info.plist文件,打開app的文件共享功能,這樣可以通過itune把需要的yuv文件上傳到iPhone上。
    b. 上傳的yuv文件,通過以下代碼,在程序裏面找到文件路徑,並打開:
#ifdef __APPLE__
char* pFolder = "/Documents/";
CFURLRef homeDir =CFCopyHomeDirectoryURL();
char inputPath[200];
char outputPath[200];
if (!CFURLGetFileSystemRepresentation(homeDir, TRUE, (UInt8 *)inputPath, PATH_MAX))
{
	printf("CFURLGetFileSystemRepresentation error\n");
}
if (!CFURLGetFileSystemRepresentation(homeDir, TRUE, (UInt8 *)outputPath, PATH_MAX))
{
	printf("CFURLGetFileSystemRepresentation error\n");
}
CFRelease(homeDir);

memcpy(inputPath + strlen(inputPath), pFolder, strlen(pFolder) + 1);
memcpy(outputPath + strlen(outputPath), pFolder, strlen(pFolder) + 1);
memcpy(inputPath + strlen(inputPath), argv[1], strlen(argv[1]) + 1);
memcpy(outputPath + strlen(outputPath), argv[2], strlen(argv[2]) + 1);
printf("input file: %s, output file %s\n", inputPath, outputPath);
inputImageFile      = fopen (inputPath, "rb");
outputBitstreamFile = fopen (outputPath, "wb");
#else
inputImageFile      = fopen (argv[1], "rb");
outputBitstreamFile = fopen (argv[2], "wb");
#endif

如此,這般,後面的測試代碼就可以和其他平臺一樣,用fread,fwrite直接對文件進行操作了。
c. 視頻編碼,圖像處理後的數據文件,也可以用itune直接拖到pc上。

飛~

補充,如果鏈接的時候報link CFURLGetFileSystemRepresentation等error,在項目build phase中選link binary with libraries,然後把CoreFoundation.Framework加入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章