分享一下Xcode除錯FFmpeg的方法,
1.配置configure檔案
首先需要配置configure生成Makefile,Makefile成功生成后再使用Xcode的External Build System執行make命令,這些操作和使用命令列編譯是一樣的,需要注意的是ffmpeg默認configure會去掉除錯符號和進行編譯優化,這樣會導致debug進入的時候沒辦法看到每個變數的值,通過執行幫助命令
./configure -h
目前最新的FFmpeg可以看到下面兩個選項

這里需要手動指定,下面是我自己的Mac下的configure命令
./configure --prefix=$BASE_PATH/build/ffmpeg_build \
--enable-debug=3 \
--disable-optimizations \
--disable-stripping \
--enable-yasm \
--enable-gpl \
--enable-pthreads
這樣生成Makefile即可,
2.匯入Xcode的External Build System
新建一個target,選擇下面的External Build System,這里專門用于執行外部編譯工具的命令編譯,由Makefile管理的這種C/C++工程都可以使用這個,

點擊next輸入target名字后保存即可,可以看到一個紅色圓圈圈的target,就是上一步創建的結果,如下圖,

這時可以先在生成的Makefile目錄(也就是FFmpeg的主目錄)下先 make clean一下,然后執行剛才創建的ffmpeg-xcode,這時正常應該是通過Xcode執行make命令,重新執行Makefile,
3.執行fftool中的可執行檔案
編譯完畢后就可以執行或者除錯ffmpeg、ffplay、ffprobe這三個程式了,
首先還是建一個控制臺程式,建完后洗掉自動生成的main檔案,如下


下一步就是把Makefile生成的ffmpeg_g設定給這個target,也就是說這個target我們不寫代碼,而是通過schema設定一個生成好的可執行檔案給target,

在檔案中找到剛才執行make生成好的可執行檔案,注意需要選擇后綴為_g的,
到這一步就可以給ffmpeg在schema中輸入引數,進行原始碼除錯了,下面隨便給ffmpeg輸入一個264檔案,

進入斷點

4.xcode查看FFmpeg原始碼
現在可以除錯代碼了,還有一個問題,如何直接在Xcode中查看整個工程的原始碼,這里我一直沒有找到特別靠譜的辦法,使用一個比較臨時的方法,先建一個控制臺target,然后把FFmpeg原始碼目錄拖入Xcode,如下

隨后會彈出對話框,第一步不要選擇外部編譯,如下

下一步直接把這些代碼關聯到剛才新建的target

然后編譯一波,這樣雖然編譯不過,但是代碼跳轉正常,
5.自己代碼呼叫FFmpeg庫除錯
上文完成了fftools中三個應用的除錯設定,下面看一下自己呼叫庫除錯的方法,
還是建一個控制臺程式,首先需要把生成靜態庫的路徑以及頭檔案路徑設定好,

下一步需要匯入Mac本地的鏈接庫,可以一邊編譯,看缺什么符號再添加,這里貼一下需要的最基本的庫,如果遇到找不到符號需要調整一下,

對于ffplay,由于其依賴SDL,需要更多的庫,下面貼出我用到的,如果編譯缺東西可以在這個基礎上調整,

下面可以在新建target中加入一段測驗代碼,嘗試運行
#include <iostream>
#include <unistd.h>
extern "C"{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
}
int main(int argc, const char * argv[]) {
AVFormatContext *format_context;
av_log_set_level(AV_LOG_VERBOSE);
format_context = avformat_alloc_context();
avformat_open_input(&format_context, "xxx/mac_build/Debug/out.h264", nullptr, nullptr);
avformat_find_stream_info(format_context, nullptr);
av_dump_format(format_context, 0, 0, 0);
while (true) {
sleep(1);
}
return 0;
}
這里存在一個問題,在FFmpeg內部執行斷點時點擊continue后面的斷點無法停止,不知道什么原因,希望了解的朋友可以指點一下,目前這里我使用命令列進行操作,手動打斷點,然后用c命令執行,
b xxxx.c:1234
c
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413943.html
標籤:其他
上一篇:移動應用程式設計基礎——期末考核——登錄界面與簡單日記本的綜合實踐
下一篇:冰狐智能輔助與AutoJS的區別
