gpt4 book ai didi

c++ - 使用与 MinGW 交叉编译的 libx264 时发生奇怪且不可预测的崩溃

转载 作者:太空狗 更新时间:2023-10-29 23:08:31 25 4
gpt4 key购买 nike

我正在 Windows 上使用 Visual Studio 2010 开发一个 C++ 项目。我正在动态链接 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

$制作-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 构建的 ilbx264 的 DLL 版本中对资源进行了一些奇怪的处理。

关于c++ - 使用与 MinGW 交叉编译的 libx264 时发生奇怪且不可预测的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9240782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com