タイトルの通りなんですが、動画ファィル関連のプログラムを書きたいなと思いました。
かなり昔、Eclipse + CDTで、デバッグ環境を構築したりして、スマホアプリを開発してたりしていました。
昨今、VisualStudio Codeが、便利過ぎて、多用しております。
開発者のみなさんは、VS Code大好きさんが、いっぱい おられるかと思います。
で、今回のネタは、ffmpegをビルドして、独自アプリを構築し、VSCodeでデバッグ環境でも構築してみようと思います。
前提として Ubuntuを使ってます。
Windowsであれば、WSLとかで用意しても問題無しです。
1.
まず、ffmpegの構築です。
とりあえず、気合の最新ソース取得です。
git clone https://git.ffmpeg.org/ffmpeg
最新ソースなので、ビルド失敗とかもあるかもしれませんよ。
では、構築ですね。
cd ffmpeg
./configure \
--extra-libs="-lpthread" \
--enable-gpl \
--disable-ffplay \
--disable-ffprobe \
--disable-ffmpeg \
--disable-programs \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--disable-iconv \
--disable-xlib \
--disable-amf \
--disable-audiotoolbox \
--disable-cuda-llvm \
--disable-cuvid \
--disable-d3d11va \
--disable-d3d12va \
--disable-dxva2 \
--disable-ffnvcodec \
--disable-libdrm \
--disable-nvdec \
--disable-nvenc \
--disable-v4l2-m2m \
--disable-vaapi \
--disable-vdpau \
--disable-videotoolbox \
--disable-vulkan \
--disable-alsa \
--disable-appkit \
--disable-avfoundation \
--disable-bzlib \
--disable-coreimage \
--disable-metal \
--disable-sndio \
--disable-schannel \
--disable-sdl2 \
--disable-securetransport \
--disable-xlib \
--disable-zlib \
--disable-amf \
--disable-audiotoolbox \
--disable-cuda-llvm \
--disable-cuvid \
--disable-d3d11va \
--disable-d3d12va \
--disable-dxva2 \
--disable-ffnvcodec \
--disable-libdrm \
--disable-nvdec \
--disable-nvenc \
--disable-v4l2-m2m \
--disable-vaapi \
--disable-vdpau \
--disable-videotoolbox
make
これで、 find . -name '*.a' -print とかを見ると以下のようにライブラリが出来ているはずです。
./libavfilter/libavfilter.a
./libswresample/libswresample.a
./libavutil/libavutil.a
./libavdevice/libavdevice.a
./libswscale/libswscale.a
./libavcodec/libavcodec.a
./libpostproc/libpostproc.a
./libavformat/libavformat.a
これで、完了です。
configureのオプションは、適当にしちゃったので、不都合があれば修正して下さいませ。
2.
独自アプリの準備
適当なディレクトリを作って、その中にcmake構成を行います。
CMakeLists.txt
cmake_minimum_required(VERSION 3.9)
# プロジェクト名と使用する言語を設定
project(test1 CXX)
set(CMAKE_CXX_STANDARD 11)
set( FFMPEG ../ffmpeg )
include_directories( ${FFMPEG})
#add_subdirectory( ${FFMPEG} )
add_executable( test1 main.cpp)
set_property(TARGET test1 PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "-g -D __STDC_CONSTANT_MACROS -Wregister -fpermissive")
find_package (Threads)
add_library(avfilter STATIC IMPORTED)
add_library(swresample STATIC IMPORTED)
add_library(avutil STATIC IMPORTED)
add_library(avdevice STATIC IMPORTED)
add_library(swscale STATIC IMPORTED)
add_library(avcodec STATIC IMPORTED)
add_library(postproc STATIC IMPORTED)
add_library(avformat STATIC IMPORTED)
set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libavfilter/libavfilter.a)
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libswresample/libswresample.a)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libavutil/libavutil.a)
set_target_properties(avdevice PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libavdevice/libavdevice.a)
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libswscale/libswscale.a)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libavcodec/libavcodec.a)
set_target_properties(postproc PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libpostproc/libpostproc.a)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libavformat/libavformat.a)
target_link_libraries( test1
-Wl,--start-group
avfilter
avutil
avdevice
swscale
avcodec
avformat
swresample
-Wl,--end-group
)
main.cpp
int main()
{
const char *input_path = "sample.mp4";
AVFormatContext *format_context = nullptr;
if (avformat_open_input(&format_context, input_path, nullptr, nullptr) != 0)
{
printf("avformat_open_input failed\n");
}
return0;
}
これで完了です。
ちょー、簡単ですね。
ビルドです。
cmake .
make
実行です。 sample.mp4 は、適当に用意して下さいね。
./test1
さー、VSCodeによるステップ実行にチャレンジです。
Extensionに、Microsoft社のC関連を追加します。
C/C++ for Visual Studio Code
C/C++ Extension UI Themes
C/C++ Extension Pack
ワークスペースに.vscode ディレクトリがあると思います。
その中に、c_cpp_properties.json ファイルがあるかと思います。
なければ、作成しましょう。
この includePathに、ffmpegのディレクトリを指定することで、VSCodeが認識するようになります。
次にデハッガを構成します。
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 起動",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/test1",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "gdb の再フォーマットを有効にする",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "逆アセンブリ フレーバーを Intel に設定",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
こんな感じであれば、大丈夫かと思います。
後は、適当なラインにブレークポイントを置いて、デバッグ((gdb) 起動)をF5 で起動すれば、停止します。
出来てしまえば、簡単なので、どんどん ffmpegの内部に侵入して解析してみましょう。
動画変換でも、解析でも、配信アプリでも 忍耐力があれば作れますよ。