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

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

ただいまの
回答率

88.03%

OpenCVとFFmpegの連携について

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 2,755

score 180

OpenCVの編集結果をFFserverにのせたいのです。
それ自体は
https://teratail.com/questions/117162
に書いている方法でできたのですが、今回はそのcaptuteの元ネタが音付きのネットワークストリームなので音付きで載せたいのです。
そこでまず
前回の手法

#include <iostream>
#include "opencv2/opencv.hpp"

typedef unsigned char byte;

int main(){
    cv::VideoCapture cam(http://????????); // 
    cv::Mat m; // 画像用の変数
    while((char)cv::waitKey(1)!='q'){
        cam >> m; // 画像の撮影

        for (auto i = m.datastart; i != m.dataend; ++i)
             std::cout << *i ;


        cv::imshow("show",m); // 画像の表示
    }
}

をコンパイルしてcppopencvを作り
cppopencv|ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - http://AAA.com:8090/webcam.ffm
で流すやり方をやめ
まず
ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - http://AAA.com:8090/webcam.ffm
の部分をコーデイングにしたいのですが
avcodec_find_encoderとか使ったプログラムを上記コードに入れたいのですがさっぱりやり方が分かりません。
いいページを知っている人はいませんか?
私が手にいれたのは下のものですがどう利用すればいいかもさっぱり不明です。

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
}

#include <iostream>
using namespace std;

int main() {
    AVCodec* m_codec;
    AVFormatContext* m_formatContext;
    AVStream* m_stream;

    unsigned m_outWidth = 768;
    unsigned m_outHeight = 608;

    av_register_all();
    avcodec_register_all();
    avformat_network_init();

    int errorStatus = 0;
    char errorLog[128] = { 0 };
    av_log_set_level(AV_LOG_TRACE);

    string m_output("http://novius-morisawa.com:8090/webcam.ffm");

    if (avformat_alloc_output_context2(&m_formatContext, NULL, "h264", m_output.c_str()) < 0) {
        cerr << "Cannot allocate output context: "
             << av_make_error_string(errorLog, 128, errorStatus) << endl;
        return -1;
    }

    AVOutputFormat *m_outputFormat = m_formatContext->oformat;

    m_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (!m_codec) {
        cerr << "Cannot find an encoder: "
             << av_make_error_string(errorLog, 128, errorStatus) << endl;
        return -1;
    }

    m_stream = avformat_new_stream(m_formatContext, m_codec);
    if (!m_stream) {
        cerr << "Cannot create a new stream: "
             << av_make_error_string(errorLog, 128, errorStatus) << endl;
        return -1;
    }


    av_dump_format(m_formatContext, 0, m_output.c_str(), 1);

    m_stream->codec->pix_fmt = AV_PIX_FMT_YUV420P;
    m_stream->codec->width = m_outWidth;
    m_stream->codec->height = m_outHeight;

    if (avcodec_open2(m_stream->codec, m_codec, NULL) < 0) {
        cerr << "Cannot open codec: "
             << av_make_error_string(errorLog, 128, errorStatus) << endl;
        return -1;
    }


    if ((errorStatus = avio_open(&m_formatContext->pb, m_output.c_str(), AVIO_FLAG_WRITE)) < 0) {
        cerr << "Cannot open output: "
             << av_make_error_string(errorLog, 128, errorStatus) << endl;
        return -1;
    }

    if (avformat_write_header(m_formatContext, NULL) < 0) {
        cerr << "Cannot write header to stream: "
             << av_make_error_string(errorLog, 128, errorStatus) << endl;
        return -1;
    }

    cout << "All done." << endl;

    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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