当我在终端中运行此命令“ ffmpeg -h encoder = h264_nvenc”时,它会显示以下输出
并且我能够通过命令行界面使用编码器,但是当我尝试从以下源代码运行时遇到了问题。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/opt.h>
#include <libswscale/swscale.h>
#include <x264.h>
}
int main( int argc, char** argv )
{
const AVCodec *codec;
AVCodecContext *c= NULL;
av_register_all();
std::cout << "Loading codec" << std::endl;
// codec = avcodec_find_encoder_by_name( "libx264" ); // works
codec = avcodec_find_encoder_by_name( "h264_nvenc" );
// codec = avcodec_find_decoder_by_name( "h264_cuvid" );
if( !codec )
{
throw std::runtime_error( "Unable to find codec!" );
}
std::cout << "Allocating context" << std::endl;
return 0;
}
答案 0 :(得分:1)
对于此最小示例,这是一个清晰的CMakeLists.txt文件。请注意,如果使用link_directories( /usr/local/lib )
的库链接不正确,所以我改用add_library
。
此外,似乎没有必要包括nvidia / cuda库来访问nvenc编解码器。
cmake_minimum_required(VERSION 2.8)
project( opencv-test )
include_directories(/usr/local/include)
add_executable( h264_nvenc
h264_nvenc.cpp
)
# link_directories( /usr/local/lib ) # does not work
add_library( avformat SHARED IMPORTED )
set_target_properties( avformat PROPERTIES IMPORTED_LOCATION /usr/local/lib/libavformat.so )
add_library( avutil SHARED IMPORTED )
set_target_properties( avutil PROPERTIES IMPORTED_LOCATION /usr/local/lib/libavutil.so )
add_library( avcodec SHARED IMPORTED )
set_target_properties( avcodec PROPERTIES IMPORTED_LOCATION /usr/local/lib/libavcodec.so )
add_library( swscale SHARED IMPORTED )
set_target_properties( swscale PROPERTIES IMPORTED_LOCATION /usr/local/lib/libswscale.so )
add_library( swresample SHARED IMPORTED )
set_target_properties( swresample PROPERTIES IMPORTED_LOCATION /usr/local/lib/libswresample.so )
target_link_libraries( h264_nvenc avformat swscale swresample avutil avcodec)
答案 1 :(得分:0)
您的代码可在我的系统上运行(查找编码器)。确保您的ffmpeg源代码是最新的,并使用--enable-nvenc
进行配置和编译。
更新: 您能否将上面的片段另存为h264_nvenc.cpp并使用以下命令进行编译:
g++ h264_nvenc.cpp -o h264_nvenc `PKG_CONFIG_PATH=/path/ffmpeg/lib/pkgconfig/ pkg-config --cflags libavformat libswscale libswresample libavutil libavcodec` `PKG_CONFIG_PATH=/path/ffmpeg/lib/pkgconfig/ pkg-config --libs libavformat libswscale libswresample libavutil libavcodec` -std=gnu++11
然后将编译后的文件测试为./h264_nvenc
然后您将看到:
Loading codec
Allocating context