Skip to content

您好!我只想用您的硬编码并推流的功能,在编译并运行代码时遇到如下问题: #2

@banzhaoyang

Description

@banzhaoyang

`
FFmpegHardCodec/Encoder/main2.cpp
////////////////////
#include "H264HardEncoder.h"
#include "log_helpers.h"
#include "MyEncDataCallListner.h"
#include <opencv2/opencv.hpp>
#include

int main(int argc, char* argv[]) {
std::string output_url = "rtsp://192.168.137.1:1935/mystream";

// Initialize your encoder and other components
HardVideoEncoder encoder;
MyEncDataCallListner enc_listener(output_url);
encoder.SetDataCallback(&enc_listener);

// Read video frames from a source (e.g., webcam or file)
cv::VideoCapture cap(0); // Open default camera
if (!cap.isOpened()) {
    std::cerr << "Error opening video stream or file" << std::endl;
    return -1;
}

cv::Mat frame;
cap >> frame;
if (frame.empty()) {
    std::cerr << "Error: captured an empty frame" << std::endl;
    return -1;
}
int width = frame.cols;
int height = frame.rows;

int fps = cap.get(cv::CAP_PROP_FPS);
// encoder.Init(frame, fps);
encoder.HardEncInit(width,height,fps);

while (true) {
    cap >> frame; // Capture frame-by-frame
    if (frame.empty()) {
        break; // End of video stream
    }

    encoder.AddVideoFrame(frame);

    // Display the resulting frame (optional)
    cv::imshow("Frame", frame);
    if (cv::waitKey(30) >= 0) {
        break; // Stop the loop on user input
    }
}

cap.release();
cv::destroyAllWindows();

return 0;

}
`

`
FFmpegHardCodec/Encoder/MyEncDataCallListner.h
//////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include <libavformat/avformat.h>

class MyEncDataCallListner : public EncDataCallListner {
public:
MyEncDataCallListner(const std::string& output_url) : output_url_(output_url), fmt_ctx_(nullptr), stream_(nullptr) {
// 初始化FFmpeg库
avformat_network_init();

    // 分配输出上下文
    avformat_alloc_output_context2(&fmt_ctx_, nullptr, "mpegts", nullptr);
    if (!fmt_ctx_) {
        std::cerr << "Could not create output context" << std::endl;
        return;
    }

    // 打开输出URL
    if (avio_open(&fmt_ctx_->pb, output_url.c_str(), AVIO_FLAG_WRITE) < 0) {
        std::cerr << "Could not open output URL" << std::endl;
        return;
    }

    // 创建输出流
    stream_ = avformat_new_stream(fmt_ctx_, nullptr);
    if (!stream_) {
        std::cerr << "Failed allocating output stream" << std::endl;
        return;
    }
}

~MyEncDataCallListner() override {
    if (fmt_ctx_) {
        av_write_trailer(fmt_ctx_);
        if (!(fmt_ctx_->oformat->flags & AVFMT_NOFILE)) {
            avio_closep(&fmt_ctx_->pb);
        }
        avformat_free_context(fmt_ctx_);
    }
}

void OnVideoEncData(unsigned char* data, int data_len, int64_t pts /*deprecated*/) override {
    if (!fmt_ctx_ || !stream_) return;

    AVPacket pkt;
    av_init_packet(&pkt);
    pkt.data = data;
    pkt.size = data_len;
    pkt.stream_index = stream_->index;

    if (av_write_frame(fmt_ctx_, &pkt) < 0) {
        std::cerr << "Error while writing video frame" << std::endl;
    }
}

void OnAudioEncData(unsigned char* data, int data_len) override {
    // Implement audio data handling if needed
}

private:
std::string output_url_;
AVFormatContext* fmt_ctx_;
AVStream* stream_;
};


cmake_minimum_required(VERSION 3.0)
project (MediaCodec) # VIDEOCODECPROJ
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
set(CMAKE_CXX_STANDARD 17) # 设置 C++ 标准 C++17
include_directories(/usr/local/include)
include_directories(/usr/local/ffmpeg/include)
include_directories(Warpper MediaCommon Log Log/spdlog FFmpegHardCodec FFmpegHardCodec/Decoder FFmpegHardCodec/Encoder MediaMuxer MediaReader)

aux_source_directory(Test TEST)
aux_source_directory(Warpper WRAPPER)
aux_source_directory(MediaCommon MEDIACOMMON)
aux_source_directory(FFmpegHardCodec/Decoder HARDDEC)
aux_source_directory(FFmpegHardCodec/Encoder HARDENC)
aux_source_directory(MediaMuxer MUXER)
aux_source_directory(MediaReader READER)

link_directories(/usr/local/lib /usr/lib)
link_directories(/usr/local/ffmpeg/lib)

set(EXECUTABLE_OUTPUT_PATH ./)

add_compile_options(-g -fpermissive -std=c++17)
set(CMAKE_BUILD_TYPE Debug)

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ./)
add_library(NX SHARED ${WRAPPER} ${MEDIACOMMON} ${HARDDEC} ${HARDENC} ${COMMON} ${MUXER} ${READER})
target_link_libraries(NX pthread lzma avutil avformat avcodec swscale swresample ${OpenCV_LIBS})

add_executable(MediaCodec ${TEST})

target_link_libraries(MediaCodec NX)

add_executable(MediaCodec ${HARDENC})
target_link_libraries(MediaCodec NX)
`
/////////////////////////////////
我编译的ffmpeg --version 输出如下
ubuntu@ubuntu-desktop:/software/FFmpeg-Media-Codec-Pipeline-master/build$ ffmpeg --version
ffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1
20.04.2)
configuration: --prefix=/usr/local/ffmpeg --extra-cflags='-I/usr/local/cuda/include -I/usr/aarch64-linux-gnu/include -fPIC' --extra-ldflags='-L/usr/local/cuda/lib64 -L/usr/aarch64-linux-gnu/lib -fPIC' --extra-libs='-lpthread -lm' --enable-gpl --enable-libdrm --enable-version3 --enable-nonfree --enable-libfreetype --enable-libvpx --enable-libx264 --enable-cuda --enable-cuvid --enable-nvenc --enable-ffnvcodec --enable-shared
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Unrecognized option '-version'.
Error splitting the argument list: Option not found

如上代码在AGX Orin上编译成功,但是在运行时输出如下,如果您能解答我将万分感激!
ubuntu@ubuntu-desktop:~/software/FFmpeg-Media-Codec-Pipeline-master/build$ /home/ubuntu/software/FFmpeg-Media-Codec-Pipeline-master/build/MediaCodec
Could not open output URL
[ WARN:[email protected]] global /usr/local/opencv-4.6.0/modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[2024-07-23 10:32:25.811] [info] Available device types:
[2024-07-23 10:32:25.812] [info] cuda
[2024-07-23 10:32:25.812] [info] vaapi
[2024-07-23 10:32:25.812] [info] drm
[h264_nvenc @ 0xaaaad3a11000] Failed to query nvenc max version: unknown error (-524878252): (no details)
Segmentation fault (core dumped)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions