我有这个在 C 中使用的代码示例:
//#define UINT64_C (uint64_t);
#pragma comment(lib, "Gdi32.lib")
#pragma comment(lib, "User32.lib")
#pragma comment(lib, "gdiplus.lib")
#include <windows.h>
#include <gdiplus.h>
#include <GdiPlusEnums.h>
using namespace Gdiplus;
extern "C" {
#include "libavcodec\avcodec.h"
#include "libavutil\mathematics.h"
//#include "libavcodec\avcodec.h"
WCHAR *fname;
AVCodec *codec;
AVCodecContext *c= NULL;
int i, ret, x, y, got_output;
int total_frame_counter;
FILE *f;
AVFrame *frame;
AVPacket pkt;
int codec_id;
uint8_t endcode[] = { 0, 0, 1, 0xb7 };
int errn;
void Encoder_init()
{
avcodec_register_all();
/* find the mpeg1 video encoder */
codec_id = CODEC_ID_MPEG1VIDEO;
codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);
if (!codec) {
fprintf(stderr, "Codec not found\n");
exit(1);
}
c = avcodec_alloc_context3(codec);
if (!c) {
fprintf(stderr, "Could not allocate video codec context\n");
exit(1);
}
/* put sample parameters */
c->bit_rate = 400000;
/* resolution must be a multiple of two */
c->width = 352;
c->height = 288;
/* frames per second */
//c->time_base= (AVRational){1,25};
c->time_base.num=1;c->time_base.den=25;
c->gop_size = 10; /* emit one intra frame every ten frames */
c->max_b_frames=1;
c->pix_fmt = AV_PIX_FMT_YUV420P;
/*
if(codec_id == AV_CODEC_ID_H264)
av_opt_set(c->priv_data, "preset", "slow", 0);
*/
}
const char *Encoder_GetCodecName( int id )
{
return avcodec_get_name( (AVCodecID)id );
}
然后我在 C++ 中有一个头文件:
const char *Encoder_GetCodecName( int id );
然后我有另一个 C++ 头文件,我正在使用它GetCodecName()
来获取列表:
List<String^> ^GetCodecs()
{
List<String^> ^l = gcnew List<String^>;
String ^s;
for (int i=0;i<3333;i++)
{
s = gcnew String(Encoder_GetCodecName( i ));
l->Add(s);
}
return l;
}
但是我现在i<3333
这样做了,可能其中一个索引是空的,因为编解码器少于 3333 个?
那么如何获取/计算 ffmpeg 库中有多少编解码器,所以我将执行以下操作:
i < codecs.Length
不使用3333
?