如何编译FFServer

From Ffmpeg工程组

Jump to: navigation, search

我知道怎样编译ffmpeg,但是编译以后我根本看不见ffserver 我的编译命令是:

./configure --enable-memalign-hack --enable-mingw32
make

但是编译后只能看见这三个.EXE文件

ffmpeg.exe,ffmpeg_g.exe,out_example.exe

请问一下,是不是要编译ffserver,还需要另外设置其它的参数啊?


默认的情况下是打开的,只有加了

--disable-ffserver --disable-network --disable-protocols --disable-muxers

等选项后才会不编译ffserver

那为什么我在默认的情况下,编译以后得不到ffserver呢?


the simplest answer is cygwin,not mingw FFserver is OK on cygwin

if you keep on with mingw32 try the following patch(dont based on CVS today)---posted by a guy on FFmpeg maillist:

--- ffmpeg_orig/configure        2006-03-28 17:36:07.000000000 -0600
+++ ffmpeg/configure        2006-03-31 08:37:14.000000000 -0600
@@ -922,7 +922,8 @@
    dv1394="no"
    dc1394="no"
    ffserver="no"
-    network="no"
+    #network="no"
+    extralibs="$extralibs -lws2_32"
if test "$mingwce" = "yes"; then
    protocols="no"
fi
diff -Naur ffmpeg_orig/libavformat/http.c ffmpeg/libavformat/http.c
--- ffmpeg_orig/libavformat/http.c        2006-01-12 16:43:23.000000000 -0600
+++ ffmpeg/libavformat/http.c        2006-03-31 13:13:56.000000000 -0600
@@ -19,14 +19,16 @@
#include "avformat.h"
#include <unistd.h>
#include <sys/types.h>
+#ifndef __MINGW32__
#include <sys/socket.h>
#include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#include <netdb.h>
+#endif
+#ifdef __BEOS__
# include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
#endif
-#include <netdb.h>


/* XXX: POST protocol is not completly implemented because ffmpeg use
diff -Naur ffmpeg_orig/libavformat/os_support.c ffmpeg/libavformat/os_support.c
--- ffmpeg_orig/libavformat/os_support.c        2006-01-22 18:57:59.000000000 -0600
+++ ffmpeg/libavformat/os_support.c        2006-03-31 09:40:29.000000000 -0600
@@ -32,6 +32,9 @@
#include <sys/time.h>
#endif
#include <time.h>
+#ifdef __MINGW32__
+#include <winsock.h>
+#endif

/**
 * gets the current time in micro seconds.
@@ -65,3 +68,30 @@
}
#endif /* !defined(HAVE_LOCALTIME_R) */
#endif /* !defined(CONFIG_WINCE) */
+
+#ifdef __MINGW32__
+int init_winsock()
+{
+WSADATA wsaData;
+WORD wVersionRequested=MAKEWORD(1,1);
+int Win32isStupid;
+
+  Win32isStupid=WSAStartup(wVersionRequested, &wsaData);
+  if (Win32isStupid) return -1;
+
+  return 0;
+}
+
+int inet_aton(const char *hostname, struct in_addr *sin_addr)
+{
+    sin_addr->s_addr=inet_addr(hostname);
+    if (sin_addr->s_addr == INADDR_NONE) {
+      return 0;
+    }
+
+    return -1;
+}
+#endif
+
+
+
diff -Naur ffmpeg_orig/libavformat/os_support.h ffmpeg/libavformat/os_support.h
--- ffmpeg_orig/libavformat/os_support.h        2004-04-24 06:51:38.000000000 -0500
+++ ffmpeg/libavformat/os_support.h        2006-03-31 13:10:17.000000000 -0600
@@ -13,7 +13,18 @@
#ifdef __MINGW32__
__declspec(dllimport) void __stdcall Sleep(unsigned long dwMilliseconds);
// #  include <windows.h>
+#define GUID microsuck_GUID
+#include <winsock.h>
+#undef GUID
#  define usleep(t)    Sleep((t) / 1000)
+#  define sleep(t)     Sleep((t) * 1000)
+typedef int socklen_t;
+#define O_NONBLOCK FIONBIO
+#define fcntl(fd,b,c) { u_long arg=1L; \
+                        ioctlsocket(fd, c, &arg); }
+// #define EINPROGRESS WSAEINPROGRESS
+#define EINPROGRESS 0
+int init_winsock();
#endif

#ifdef __BEOS__
diff -Naur ffmpeg_orig/libavformat/rtp.c ffmpeg/libavformat/rtp.c
--- ffmpeg_orig/libavformat/rtp.c        2006-03-30 10:44:32.000000000 -0600
+++ ffmpeg/libavformat/rtp.c        2006-03-31 13:14:03.000000000 -0600
@@ -22,14 +22,16 @@

#include <unistd.h>
#include <sys/types.h>
+#ifndef __MINGW32__
#include <sys/socket.h>
#include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#include <netdb.h>
+#endif
+#ifdef __BEOS__
# include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
#endif
-#include <netdb.h>

//#define DEBUG

diff -Naur ffmpeg_orig/libavformat/rtpproto.c ffmpeg/libavformat/rtpproto.c
--- ffmpeg_orig/libavformat/rtpproto.c        2006-01-12 16:43:25.000000000 -0600
+++ ffmpeg/libavformat/rtpproto.c        2006-03-31 13:14:08.000000000 -0600
@@ -21,14 +21,16 @@
#include <unistd.h>
#include <stdarg.h>
#include <sys/types.h>
+#ifndef __MINGW32__
#include <sys/socket.h>
#include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#include <netdb.h>
+#endif
+#ifdef __BEOS__
# include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
#endif
-#include <netdb.h>
#include <fcntl.h>

#define RTP_TX_BUF_SIZE  (64 * 1024)
diff -Naur ffmpeg_orig/libavformat/rtsp.c ffmpeg/libavformat/rtsp.c
--- ffmpeg_orig/libavformat/rtsp.c        2006-03-10 18:22:21.000000000 -0600
+++ ffmpeg/libavformat/rtsp.c        2006-03-31 13:14:12.000000000 -0600
@@ -20,12 +20,14 @@
 
#include <unistd.h> /* for select() prototype */
#include <sys/time.h>
+#ifndef __MINGW32__
#include <netinet/in.h>
#include <sys/socket.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#endif
+#ifdef __BEOS__
# include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
#endif

//#define DEBUG
diff -Naur ffmpeg_orig/libavformat/tcp.c ffmpeg/libavformat/tcp.c
--- ffmpeg_orig/libavformat/tcp.c        2006-02-02 07:07:30.000000000 -0600
+++ ffmpeg/libavformat/tcp.c        2006-03-31 13:06:43.000000000 -0600
@@ -19,17 +19,19 @@
#include "avformat.h"
#include <unistd.h>
#include <sys/types.h>
+#ifndef __MINGW32__
#include <sys/socket.h>
#include <netinet/in.h>
+#include <netdb.h>
+#endif
#if defined(__BEOS__) || defined(__INNOTEK_LIBC__)
typedef int socklen_t;
#endif
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#ifdef __BEOS__
# include "barpainet.h"
+#elif !defined (__MINGW32__)
+# include <arpa/inet.h>
#endif
-#include <netdb.h>
#include <sys/time.h>
#include <fcntl.h>

@@ -77,6 +79,10 @@
    if (port <= 0 || port >= 65536)
        goto fail;

+#ifdef __MINGW32__
+    init_winsock();
+#endif
+
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(port);
    if (resolve_host(&dest_addr.sin_addr, hostname) < 0)
@@ -147,11 +153,7 @@
        tv.tv_usec = 100 * 1000;
        ret = select(fd_max + 1, &rfds, NULL, NULL, &tv);
        if (ret > 0 && FD_ISSET(s->fd, &rfds)) {
-#ifdef __BEOS__
            len = recv(s->fd, buf, size, 0);
-#else
-            len = read(s->fd, buf, size);
-#endif
            if (len < 0) {
                if (errno != EINTR && errno != EAGAIN)
#ifdef __BEOS__
@@ -184,11 +186,7 @@
        tv.tv_usec = 100 * 1000;
        ret = select(fd_max + 1, NULL, &wfds, NULL, &tv);
        if (ret > 0 && FD_ISSET(s->fd, &wfds)) {
-#ifdef __BEOS__
            len = send(s->fd, buf, size, 0);
-#else
-            len = write(s->fd, buf, size);
-#endif
            if (len < 0) {
                if (errno != EINTR && errno != EAGAIN) {
#ifdef __BEOS__
@@ -211,7 +209,7 @@
static int tcp_close(URLContext *h)
{
    TCPContext *s = h->priv_data;
-#ifdef CONFIG_BEOS_NETSERVER
+#if defined(CONFIG_BEOS_NETSERVER) || defined(__MINGW32__)
    closesocket(s->fd);
#else
    close(s->fd);
diff -Naur ffmpeg_orig/libavformat/udp.c ffmpeg/libavformat/udp.c
--- ffmpeg_orig/libavformat/udp.c        2006-01-12 16:43:25.000000000 -0600
+++ ffmpeg/libavformat/udp.c        2006-03-31 13:06:54.000000000 -0600
@@ -19,14 +19,16 @@
#include "avformat.h"
#include <unistd.h>
#include <sys/types.h>
+#ifndef __MINGW32__
#include <sys/socket.h>
+#include <netdb.h>
#include <netinet/in.h>
-#ifndef __BEOS__
-# include <arpa/inet.h>
-#else
+#endif
+#ifdef __BEOS__
# include "barpainet.h"
+#elif !defined(__MINGW32__)
+# include <arpa/inet.h>
#endif
-#include <netdb.h>

#ifndef IPV6_ADD_MEMBERSHIP
#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
@@ -211,7 +213,7 @@

 fail:
    if (udp_fd >= 0)
-#ifdef CONFIG_BEOS_NETSERVER
+#if defined(CONFIG_BEOS_NETSERVER) || defined(__MINGW32__)
        closesocket(udp_fd);
#else
        close(udp_fd);
@@ -357,6 +359,11 @@
    getsockname(udp_fd, (struct sockaddr *)&my_addr1, &len);
    s->local_port = ntohs(my_addr1.sin_port);

+#ifdef __MINGW32__
+    tmp=65536;   /* 64k UDP buffer size.  Should this be bigger? */
+    setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp));
+#endif
+
#ifndef CONFIG_BEOS_NETSERVER
    if (s->is_multicast) {
        if (h->flags & URL_WRONLY) {
@@ -411,7 +418,7 @@
    return 0;
 fail:
    if (udp_fd >= 0)
-#ifdef CONFIG_BEOS_NETSERVER
+#if defined(CONFIG_BEOS_NETSERVER) || defined(__MINGW32__)
        closesocket(udp_fd);
#else
        close(udp_fd);
@@ -471,7 +478,7 @@
{
    UDPContext *s = h->priv_data;

-#ifndef CONFIG_BEOS_NETSERVER
+#if !defined(CONFIG_BEOS_NETSERVER) && !defined(__MINGW32__)
#ifndef CONFIG_IPV6
    if (s->is_multicast && !(h->flags & URL_WRONLY)) {
        if (setsockopt(s->udp_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,


有关该问题的讨论帖可参考ffmpeg工程组论坛中的相关讨论:

有关编译FFServer的讨论
Personal tools