使用ffmpeg时编译错误

时间:2013-01-17 15:18:01

标签: macos gcc ffmpeg

我在Qt Mac中编译ffmpeg的例子时发现了一个奇怪的问题。

我已经安装了ffmpeg库,我已经在终端上用cc和gcc编译器测试了这个例子,在编译和运行的情况下我没有任何问题。

但是当我在Qt中调用库(ffmpeg是C库)来编译相同的代码代码时,g ++编译器给了我很多错误。

我在main.cpp代码中使用了这个结构:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>

extern "C" {
#include <libavutil/imgutils.h>
#include <libavutil/samplefmt.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
}

#include <QDebug>

和编译输出给了我:

In file included from ../audvid/main.cpp:7:
/opt/local/include/libavutil/timestamp.h: In function 'char*
av_ts_make_string(char*, int64_t)':
/opt/local/include/libavutil/timestamp.h:48: warning: comparison
between signed and unsigned integer expressions
/opt/local/include/libavutil/timestamp.h:49: error: expected `)'
before 'PRId64' /opt/local/include/libavutil/timestamp.h:49: warning:
spurious trailing '%' in format
/opt/local/include/libavutil/timestamp.h:49: warning: too many
arguments for format /opt/local/include/libavutil/timestamp.h: At
global scope: /opt/local/include/libavutil/timestamp.h:68: error:
'AVRational' has not been declared
/opt/local/include/libavutil/timestamp.h: In function 'char*
av_ts_make_time_string(char*, int64_t, int*)':
/opt/local/include/libavutil/timestamp.h:70: warning: comparison
between signed and unsigned integer expressions
/opt/local/include/libavutil/timestamp.h:71: error: 'av_q2d' was not
declared in this scope ../audvid/main.cpp: In function 'int
decode_packet(int*, int)': ../audvid/main.cpp:50: error: cannot
convert 'AVRational*' to 'int*' for argument '3' to 'char*
av_ts_make_time_string(char*, int64_t, int*)' ../audvid/main.cpp:73:
error: cannot convert 'AVRational*' to 'int*' for argument '3' to
'char* av_ts_make_time_string(char*, int64_t, int*)'
../audvid/main.cpp:75: error: 'struct AVFrame' has no member named
'channels' ../audvid/main.cpp:84: error: 'struct AVFrame' has no
member named 'channels' ../audvid/main.cpp:90: error: 'struct AVFrame'
has no member named 'channels' ../audvid/main.cpp: In function 'int
open_codec_context(int*, AVFormatContext*, AVMediaType)':
../audvid/main.cpp:112: error: 'av_get_media_type_string' was not
declared in this scope ../audvid/main.cpp:123: error:
'av_get_media_type_string' was not declared in this scope
../audvid/main.cpp:129: error: 'av_get_media_type_string' was not
declared in this scope ../audvid/main.cpp: In function 'int
get_format_from_sample_fmt(const char**, AVSampleFormat)':
../audvid/main.cpp:152: warning: comparison between signed and
unsigned integer expressions ../audvid/main.cpp: In function 'int
main(int, char**)': ../audvid/main.cpp:239: error: invalid conversion
from 'void*' to 'uint8_t**' make: *** [main.o] Error 1 make: Leaving
directory
`/Users/polin/Desktop/audvid/audvid-build-    Qt_4_8_0_qt_everywhere_opensource_src_4_8_0_tp-Release'
10:44:37: The process "/usr/bin/make" exited with code 2. Error while
building/deploying project audvid (target: Qt 4.8.0
(qt-everywhere-opensource-src-4.8.0-tp)) When executing step 'Make'

我不明白我是否在代码中犯了错误,或者我是否必须更改Qt编译器? (而且我不知道怎么做)

2 个答案:

答案 0 :(得分:1)

您需要在libavutil/avutil.h之前加入#include <libavutil/imgutils.h>。您还需要添加#include <libavcodec/avcodec.h>

答案 1 :(得分:0)

因为ffmpeg是用纯C编写的。某些C99设计与g ++编译器不兼容。所以解决它的一种方法是找到“错误的”源代码的位置,并用C ++设计风格替换它们。 例如

unsigned long L1, L2;
signed short S1, S2;

L1 = 0x12345678;    /* Initial ulong to store away into two sshort */
S1 = L1 & 0xFFFF;   /* Store component 1 */
S2 = L1 >> 16;      /* Store component 2*/
L2 = S1 | (S2<<16); /* Retrive ulong from two sshort */

/* Print results */
printf("Initial value: 0x%08lx\n",L1);
printf("Stored component 1: 0x%04hx\n",S1);
printf("Stored component 2: 0x%04hx\n",S2);
printf("Retrieved value: 0x%08lx\n",L2);