ffmpeg avcodec_find_encoder_by_name找不到编码器h264_nvenc

时间:2018-07-17 14:56:45

标签: encoding ffmpeg decode nvidia

当我在终端中运行此命令“ 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;

}

2 个答案:

答案 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