質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

CMakeを使ってビルドする時のエラー

Motiko
Motiko

総合スコア10

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

0クリップ

376閲覧

投稿2022/06/03 16:45

編集2022/06/22 10:53

前提

TelloEDUをPythonで操作するため環境構築を行なっています。
https://take6shin-tech-diary.com/tello-video-python3/#toc3
参考:「Tello_VideoをAnaconda Python3環境で動かす」

H.264デコーダをCMakeを使ってビルドする際にエラーが発生しました。

実現したいこと

エラーを消してビルドしたい・・・

発生している問題・エラーメッセージ

$ cmake .. -- Found pybind11: /Users/masudayouko/opt/anaconda3/envs/Tello/include (found version "2.9.2") Using existing pybind11 v2.9.2 -- Configuring done -- Generating done -- Build files have been written to: /Users/masudayouko/h264decoder/build $ cmake --build . Consolidate compiler generated dependencies of target h264decoderlib [ 25%] Building CXX object CMakeFiles/h264decoderlib.dir/src/h264decoder.cpp.o /Users/xxxx/h264decoder/src/h264decoder.cpp:23:3: error: use of undeclared identifier 'avcodec_register_all' avcodec_register_all(); ^ /Users/xxxx/h264decoder/src/h264decoder.cpp:25:11: error: assigning to 'AVCodec *' from 'const AVCodec *' discards qualifiers codec = avcodec_find_decoder(AV_CODEC_ID_H264); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /Users/xxxx/h264decoder/src/h264decoder.cpp:54:3: warning: 'av_init_packet' is deprecated [-Wdeprecated-declarations] av_init_packet(pkt); ^ /usr/local/include/libavcodec/packet.h:505:1: note: 'av_init_packet' has been explicitly marked deprecated here attribute_deprecated ^ /usr/local/include/libavutil/attributes.h:100:49: note: expanded from macro 'attribute_deprecated' # define attribute_deprecated __attribute__((deprecated)) ^ 1 warning and 2 errors generated. make[2]: *** [CMakeFiles/h264decoderlib.dir/src/h264decoder.cpp.o] Error 1 make[1]: *** [CMakeFiles/h264decoderlib.dir/all] Error 2 make: *** [all] Error 2

該当のソースコード

C++

extern "C" { #include <libavcodec/avcodec.h> #include <libavutil/avutil.h> #include <libavutil/imgutils.h> #include <libavutil/mem.h> #include <libswscale/swscale.h> } #include "h264decoder.hpp" #include <utility> // ****** この行を追加 ****** typedef unsigned char ubyte; /* For backward compatibility with release 9 or so of libav */ #if (LIBAVCODEC_VERSION_MAJOR <= 54) # define av_frame_alloc avcodec_alloc_frame # define av_frame_free avcodec_free_frame #endif H264Decoder::H264Decoder() { avcodec_register_all(); codec = avcodec_find_decoder(AV_CODEC_ID_H264); if (!codec) throw H264InitFailure("cannot find decoder"); context = avcodec_alloc_context3(codec); if (!context) throw H264InitFailure("cannot allocate context"); // Note: CODEC_CAP_TRUNCATED was prefixed with AV_... if(codec->capabilities & AV_CODEC_CAP_TRUNCATED) { context->flags |= AV_CODEC_FLAG_TRUNCATED; } int err = avcodec_open2(context, codec, nullptr); if (err < 0) throw H264InitFailure("cannot open context"); parser = av_parser_init(AV_CODEC_ID_H264); if (!parser) throw H264InitFailure("cannot init parser"); frame = av_frame_alloc(); if (!frame) throw H264InitFailure("cannot allocate frame"); #if 1 pkt = new AVPacket; if (!pkt) throw H264InitFailure("cannot allocate packet"); av_init_packet(pkt); #endif } H264Decoder::~H264Decoder() { av_parser_close(parser); avcodec_close(context); av_free(context); av_frame_free(&frame); #if 1 delete pkt; #endif } ptrdiff_t H264Decoder::parse(const ubyte* in_data, ptrdiff_t in_size) { auto nread = av_parser_parse2(parser, context, &pkt->data, &pkt->size, in_data, in_size, 0, 0, AV_NOPTS_VALUE); return nread; } bool H264Decoder::is_frame_available() const { return pkt->size > 0; } const AVFrame& H264Decoder::decode_frame() { #if (LIBAVCODEC_VERSION_MAJOR > 56) int ret; if (pkt) { ret = avcodec_send_packet(context, pkt); if (!ret) { ret = avcodec_receive_frame(context, frame); if (!ret) return *frame; } } throw H264DecodeFailure("error decoding frame"); #else int got_picture = 0; int nread = avcodec_decode_video2(context, frame, &got_picture, pkt); if (nread < 0 || got_picture == 0) throw H264DecodeFailure("error decoding frame\n"); return *frame; #endif } ConverterRGB24::ConverterRGB24() { framergb = av_frame_alloc(); if (!framergb) throw H264DecodeFailure("cannot allocate frame"); context = nullptr; } ConverterRGB24::~ConverterRGB24() { sws_freeContext(context); av_frame_free(&framergb); } const AVFrame& ConverterRGB24::convert(const AVFrame &frame, ubyte* out_rgb) { int w = frame.width; int h = frame.height; int pix_fmt = frame.format; context = sws_getCachedContext(context, w, h, (AVPixelFormat)pix_fmt, w, h, AV_PIX_FMT_RGB24, SWS_BILINEAR, nullptr, nullptr, nullptr); if (!context) throw H264DecodeFailure("cannot allocate context"); // Setup framergb with out_rgb as external buffer. Also say that we want RGB24 output. av_image_fill_arrays(framergb->data, framergb->linesize, out_rgb, AV_PIX_FMT_RGB24, w, h, 1); // Do the conversion. sws_scale(context, frame.data, frame.linesize, 0, h, framergb->data, framergb->linesize); framergb->width = w; framergb->height = h; return *framergb; } /* Determine required size of framebuffer. avpicture_get_size is used in http://dranger.com/ffmpeg/tutorial01.html to do this. However, avpicture_get_size returns the size of a compact representation, without padding bytes. Since we use av_image_fill_arrays to fill the buffer we should also use it to determine the required size. */ int ConverterRGB24::predict_size(int w, int h) { return av_image_fill_arrays(framergb->data, framergb->linesize, nullptr, AV_PIX_FMT_RGB24, w, h, 1); } std::pair<int, int> width_height(const AVFrame& f) { return std::make_pair(f.width, f.height); } int row_size(const AVFrame& f) { return f.linesize[0]; } void disable_logging() { av_log_set_level(AV_LOG_QUIET); }

試したこと

anacondaの再インストール
ffmpegのupdate
ffmpegの再インストール

補足情報(FW/ツールのバージョンなど)

MacOS Monterey 12.2
C++ 13.0.0
Python 3.9.13
conda 4.13.0

ffmpegはHomebrewよりインストールしてあります。
C++は使ったことがないので、初歩的な質問かもしれませんがよろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Motiko

2022/06/04 08:57

ご教授いただき、ありがとうございます! 一応、自己解決しましたが、挙動が安定しないのでffmpeg4も試してみようと思います。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。