タイトルの通りなんですが、動画ファィル関連のプログラムを書きたいなと思いました。

かなり昔、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

extern "C"
{
#include <stdio.h>
 
#include "config.h"
#include "config_components.h"
 
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
}

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 ファイルがあるかと思います。

なければ、作成しましょう。

 

c_cpp_properties.json
 
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/home/hogehoge/ffmpeg"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

この 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の内部に侵入して解析してみましょう。

動画変換でも、解析でも、配信アプリでも 忍耐力があれば作れますよ。

 

 

 

Joomla templates by a4joomla