BreakingY / Media-Codec-Pipeline

音视频(H264/H265/AAC)封装、解封装、编解码pipeline,支持NVIDIA、昇腾DVPP硬编解码
MIT License
20 stars 5 forks source link

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

Open banzhaoyang opened 2 months ago

banzhaoyang commented 2 months ago

`

FFmpegHardCodec/Encoder/main2.cpp //////////////////// #include "H264HardEncoder.h" #include "log_helpers.h" #include "MyEncDataCallListner.h" #include #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 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:0@0.429] 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)
BreakingY commented 2 months ago

jetson上的视频编解码库是jetson_multimedia_api ,和x86上的不一样,这个项目的代码不适用,jetson视频编解码可以用我另外一个项目https://github.com/BreakingY/jetpack-dec-enc

banzhaoyang commented 2 months ago

多谢您的解答~