用ffmpeg来进行视频编码,用JRTPLIB库来进行网络传输,来完成实时视频传输。
这里修改ffmpeg源码中的例子output_example.c来完成对视频的编码,并创建一个线程来完成网络传输,它们之间通过互斥锁来进行通信。
网络传输my_net_transfer.cpp是基于JRTPLIB库来编写的一个发送程序。
硬件环境ADI公司的DSP芯片是blackfin ADSP-BF537,其软件的编译工具链为bfin-linux-uclibc-xxx。
这里涉及到C与C++的混合编译。my_net_transfer.cpp用bfin-linux-uclibc-g++来编译,output_example.c用bfin-linux-uclibc-gcc来编译(当然也可以用g++来编译,如果用g++来编译,需要将output_example.c中的所有代码用extern "C"{}括起来,来告知编译器这其中的代码请根据C的规则来编译)。最后将output_example.o和my_net_transfer.o以及一些用到的库进行链接,经过我的试验,可以用gcc也可以用g++来链接,我的Makefile是根据ffmpeg中的Makefile来改写的,主要相关内容如下:
INCLUDE =/home/seuic/h_SlaveH_CentOS5H2nd/ip_camera_bf536/jrtplib-3.7.1/install_wangsu/include/jrtplib3
LIB_INC=-L/home/seuic/h_SlaveH_CentOS5H2nd/ip_camera_bf536/jrtplib-3.7.1/install_wangsu/lib
LIB_INC += -L/home/seuic/h_SlaveH_CentOS5H2nd/ip_camera_bf536/trunk/lib/ffmpeg/ffmpeg-svn-9768/install/lib
LIB_NAME = jrtp
INCLD = -I $(INCLUDE)
NETOBJ = my_net_transfer.o
NETSRC = my_net_transfer.cpp
CXX = bfin-linux-uclibc-g++
CFLAGSNET += -g -Wall
EXPOBJ = output_example.o
EXPSRC = output_example.c
MYFLAGS=-I$(BUILD_ROOT) -I$(SRC_PATH) -I$(SRC_PATH)/libavutil
-I$(SRC_PATH)/libavcodec -I$(SRC_PATH)/libavformat -I$(SRC_PATH)/libswscale
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_ISOC9X_SOURCE -DHAVE_AV_CONFIG_H
output_example$(EXESUF): $(NETOBJ) $(EXPOBJ)
@echo ""
@echo ">>>>>>begin to generate output_example<<<<<<"
$(CC) -o $@ $^ $(LIB_INC) $(EXTRALIBS) -lpthread -l$(LIB_NAME)
#如果把下面的参数加上去的话,链接就会出错
#$(CXX) $(LDFLAGS) -o $@ $< $(LIB_INC) $(EXTRALIBS) -lpthread -l$(LIB_NAME)
$(EXPOBJ): $(EXPSRC)
@echo ""
@echo ">>>>>>begin to compile output_example.c<<<<<<"
$(CC) $(MYFLAGS) -c $^
$(NETOBJ): $(NETSRC)
@echo ""
@echo ">>>>>>begin to compile my_net_transfer.cpp<<<<<<"
$(CXX) $(CFLAGSNET) $(INCLD) -c $^
example_clean:
rm -f output_example.o output_example my_net_transfer.o
我之前编译了很多次,都因为出现链接错误,提示某某函数未定义什么的。我起初怀疑是自己的C与C++混合编译错误,后来才了解到其实自己的C与C++混合编译没有错误,主要错误是出现在链接的时候的参数不恰当,$(LDFLAGS)该参数是ffmpeg源码里的Makefile文件中的,我之前编译output_example.c(仅作编码未启动网络传输的一个版本)的时候,该参数是可用的,但这次再与网络传输相结合时就挂掉了,死都链接不过去,还会提示"_main"未找到,可查看之前的《C与C++混合编译》博文。一狠心就把这参数干掉了。
我在链接时添加进去的库有ffmpeg库,jrtplib库以及pthread库。
转载:http://blog.sina.com.cn/s/blog_4e87ac6e0100ao6k.html