我正在使用Windows上的Visual Studio 2010进行C++项目。我正在按照x264动态链接到x264,我使用MinGW将自己建立为共享库,

http://www.ayobamiadewole.com/Blog/Others/x264compilation.aspx

奇怪的是我的x264代码有时可以正常工作。然后,当我更改一些代码行(甚至更改文件中的注释!)并重新编译该行中的所有崩溃时

encoder_ = x264_encoder_open(&param);

随着消息
Access violation reading location 0x00000000

我根本没有做任何时髦的事情,因此可能不是我的代码有问题,但是我猜链接有问题,或者我编译x264的方式有问题。

完整的初始化代码:
x264_param_t param = { 0 };
if (x264_param_default_preset(&param, "ultrafast", "zerolatency") < 0) {
  throw KStreamerException("x264_param_default_preset failed");
}

param.i_threads = 1;
param.i_width = 640;
param.i_height = 480;
param.i_fps_num = 10;
param.i_fps_den = 1;

encoder_ = x264_encoder_open(&param); // <-----
if (encoder_ == 0) {
  throw KStreamerException("x264_encoder_open failed");
}

x264_picture_alloc(&pic_, X264_CSP_I420, 640, 480);

编辑:原来,它始终在 Release模式下工作,并且使用超快而不是超快时,它也可以在 Debug模式下100%工作。难道是超快速模式正在执行一些调试器不喜欢的疯狂优化吗?

最佳答案

我也用libx264-120遇到了这个问题。
libx264-120是基于 MinGW 和如下配置选项构建的。

$ ./configure --disable-cli --enable-shared --extra-ldflags = -Wl,-output-def = libx264-120.def --enable-debug --enable-win32thread

platform:      X86
system:        WINDOWS
cli:           no
libx264:       internal
shared:        yes
static:        no
asm:           yes
interlaced:    yes
avs:           yes
lavf:          no
ffms:          no
gpac:          no
gpl:           yes
thread:        win32
filters:       crop select_every
debug:         yes
gprof:         no
strip:         no
PIC:           no
visualize:     no
bit depth:     8
chroma format: all

$ make -j8

lib /def:libx264-120.def / machine:x86
#include "stdafx.h"
#include <iostream>
#include <cassert>

using namespace std;

#include <stdint.h>
extern "C"{
#include <x264.h>
}

int _tmain(int argc, _TCHAR* argv[])
{
int width(640);
int height(480);

int err(-1);

x264_param_t x264_param = {0};
//x264_param_default(&x264_param);

err =
    x264_param_default_preset(&x264_param, "veryfast", "zerolatency");
assert(0==err);

x264_param.i_threads = 8;
x264_param.i_width = width;
x264_param.i_height = height;
x264_param.i_fps_num = 60;//fps;
x264_param.i_fps_den = 1;
// Intra refres:
x264_param.i_keyint_max = 60;//fps;
x264_param.b_intra_refresh = 1;
//Rate control:
x264_param.rc.i_rc_method = X264_RC_CRF;
x264_param.rc.f_rf_constant = 25;
x264_param.rc.f_rf_constant_max = 35;
//For streaming:
x264_param.b_repeat_headers = 1;
x264_param.b_annexb = 1;

err = x264_param_apply_profile(&x264_param, "baseline");
assert(0==err);

x264_t *x264_encoder = x264_encoder_open(&x264_param);
x264_encoder = x264_encoder;


x264_encoder_close( x264_encoder );

getchar();
return 0;
}

该程序有时会成功。但是在x264_encoder_open上经常会因访问冲突而失败。
有关此信息在Google上不存在。以及如何初始化x264_param_t和如何使用x264_encoder_open尚不清楚。

行为似乎是由x264的设置值引起的,但是如果不阅读一些使用libx264的开源程序,我将无法知道这些。

而且,这种访问冲突似乎在第一次执行时以及在用MinGW的gcc编译时都不会发生(例如gcc -o test test.c -lx264; ./ test)

由于这种行为,我认为libx264在基于MinGW的gcc构建的DLL版本的ilbx264中进行了一些奇怪的资源处理。

09-06 13:22