我正在使用Windows上的Visual Studio 2010开发C ++项目。我正在动态链接x264,我根据
指南使用MinGW将自己构建为共享库http://www.ayobamiadewole.com/Blog/Others/x264compilation.aspx
奇怪的是我的x264代码正常运行有时。然后,当我更改某些代码行(甚至更改文件中的注释!)并重新编译行中的所有内容时崩溃
encoder_ = x264_encoder_open(¶m);
带有消息
Access violation reading location 0x00000000
我根本没有做任何有趣的事情,所以可能不是我的代码错了但是我觉得链接出了问题,或者我编译x264的方式可能有问题。
完整的初始化代码:
x264_param_t param = { 0 };
if (x264_param_default_preset(¶m, "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(¶m); // <-----
if (encoder_ == 0) {
throw KStreamerException("x264_encoder_open failed");
}
x264_picture_alloc(&pic_, X264_CSP_I420, 640, 480);
编辑:事实证明它总是在发布模式下工作,当使用超高速而不是超高速时,它也可以100%在调试模式下工作。可能是超快模式正在做一些调试器不喜欢的疯狂优化吗?
答案 0 :(得分:1)
我也用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中做了一些奇怪的资源处理。
答案 1 :(得分:0)
我遇到了同样的问题。我能够解决它的唯一方法是在没有asm选项的情况下构建x264 dll(即指定--disable-asm)