-
Notifications
You must be signed in to change notification settings - Fork 15
Description
`
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 --version20.04.2)
ffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1
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)