加载中…
个人资料
wuqiseu
wuqiseu
  • 博客等级:
  • 博客积分:0
  • 博客访问:9,563
  • 关注人气:62
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ffmpeg SDK 开发使用zz

(2016-06-01 22:20:10)
分类: 多媒体中间件平台

zeranoe debug和release:

win7 下开发视频服务器,用到ffmpeg,debug版本运行正常,切换到release时,出现"0x00905a4d 处未处理的异常: 0xC0000005: 读取位置 0x00905a4d 时发生访问冲突",原以为是jrtplib得问题,鼓捣半天才发现是ffmpeg. 用一个很小的测试程序验证,在av_register_all处就崩溃.鸟! 
难道是用mingw生成ffmpeg时有调试信息,应用程序用release编译冲突?
ffmpeg版本老旧,有这个bug?
我编译的选项不对?
测试排除了上面3个疑问. 那就只有debug和release版本的区别了. 将release的优化选项逐个的剔除测试,找到了问题所在:
连接器->优化->引用 
在release版本下面使用"保留未引用数据(/OPT:NOREF)"选项才可以正常运行.

your-application->properties->Linker->Optimization->References and select
OPT/NOREF. 

https://ffmpeg.org/pipermail/libav-user/2013-March/003972.html




资源收集:

https://trac.ffmpeg.org/wiki

https://ffmpeg.org/documentation.html


在ffmpeg中调用opencv:

利用ffmpeg和opencv进行视频的解码播放

在opencv中调用ffmpeg是比较容易的,可以参考opencv的文档。


 

FFmpeg发送流媒体的命令(UDP,RTP,RTMP)

ffmpeg库 在vs2012中的调用

http://m.blog.csdn.net/article/details?id=51014307

其实shared和dev库都是需要的,shared中的DLL是在程序运行的时候需要,

    把dev版本与share版本都下下来解压,dev版本文件夹中的Include和lib目录整个儿复制到VS项目目录下。接着将share版本文件夹中bin目录下对应的所有dll复制到项目路径下


这两天研究了FFmpeg发送流媒体的命令,在此简单记录一下以作备忘。

http://blog.csdn.net/leixiaohua1020/article/details/38283297

windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载http://blog.csdn.net/harvic880925/article/details/8024445

ffmpeg开发--ffmpeg sdk下载

http://www.cnblogs.com/js2854/archive/2013/05/16/ffmpeg-sdk.html

 

注意到不同的FFMPEG的版本中API的名称已经有些变化了:

ffmpeg2.4.2默认是不支持av_close_input_file函数的了,换成了avformat_close_input函数

avcodec_alloc_frame -> av_frame_alloc

av_close_input_file -> avformat_close_input

PIX_FMT_RGB24 -> AV_PIX_FMT_RGB24

av_find_stream_info -> avformat_find_stream_info

有很多函数已经不建议使用了deprecated。但是如果你不想改可以暂时使用下面的方法:

可以在c/c++->advanced then Disable specific warnings, add 4996 , if you want to add more simply just do 4996;0001;0002 etc.



FFMPEG SDK 可以自己源代码编译,也可以直接使用编译好的:

FFMPEG官网  http://www.ffmpeg.org/

API地址       http://www.ffmpeg.org/doxygen/trunk/index.html

由于在windows下编译非常痛苦,所以还是推荐大家去直接下载编译好的二进制文件,注意官网上并没有直接完整的开发包,你需要分别取下载Linux或者windows下的

共享库 对于windows下还需要下载 .lib导入库,由于我是windows下 这里我就提供windows下载地址

http://ffmpeg.zeranoe.com/builds/   这个页面可以下载到 动态库和到入库。。因为FFMPEG已经交由别的组织维护了。。。 在下面这个页面找吧 还有一点就是 既然用人家的东西 记住一定要遵循LGPL或GPL许可证...别给国人丢脸  

人家老外都这么说了 

Donating shows that you benefit from my work and are thankful for the time I spend on it. So if you like my work and would like to see more, feel free to donate, if you can't right now don't worry about it and just enjoy using FFmpeg on Windows. Thank you to everyone who has donated in the past!

http://img.blog.csdn.net/20141217025323984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlNzYwMzgzNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/CenterSDK 开发使用zz" />


 

 

 模块:
        libavcodec    - 编码解码器
        libavdevice   - 输入输出设备的支持
        libavfilter   - 视音频滤镜支持
        libavformat   - 视音频等格式的解析
        libavutil     - 工具库
        libpostproc   - 后期效果处理
        libswscale    - 图像颜色、尺寸转换

 

ffmpeg每部分功能都采用plugin的方式,使用统一的接口调用,这样就能够非常方便的使用和扩展。
    plugin分为几种:muxer,demuxer,protocol,hwaccel,encoder,decoder,parser,bitstream,filter,...
    因此在使用SDK的时候第一步就是注册plugin
    
    avcodec_register_all()  : 注册 hwaccel,encoder,decoder,parser,bitstream
    av_register_all()       : 注册 muxer,demuxer,protocol
    avfilter_register_all() : 注册 滤镜filter
 

 

H.264的解析器(Parser)在解析数据的时候调用h264_parse(),h264_parse()调用了parse_nal_units(),parse_nal_units()则调用了一系列解析特定NALU的函数。H.264的解码器(Decoder)在解码数据的时候调用h264_decode_frame(),h264_decode_frame()调用了decode_nal_units(),decode_nal_units()也同样调用了一系列解析不同NALU的函数。
图中简单列举了几个解析特定NALU的函数:

ff_h264_decode_nal():解析NALU Header
ff_h264_decode_seq_parameter_set():解析SPS
ff_h264_decode_picture_parameter_set():解析PPS
ff_h264_decode_sei():解析SEI

 

bitstream filter:

http://www.ffmpeg.org/ffmpeg-bitstream-filters.html

 

滤镜filter的使用(crop, resize, deinterlace, drawtext, overlay, vflip, ...)



1.      UDP

1.1. 发送H.264裸流至组播地址

注:组播地址指的范围是224.0.0.0—239.255.255.255

下面命令实现了发送H.264裸流“chunwan.h264”至地址udp://233.233.233.223:6666

 

[plain] view plain copy
  1. ffmpeg -re -i chunwan.h264 -vcodec copy -f h264 udp://233.233.233.223:6666  

 

注1:-re一定要加,代表按照帧率发送,否则ffmpeg会一股脑地按最高的效率发送数据。

注2:-vcodec copy要加,否则ffmpeg会重新编码输入的H.264裸流。

1.2. 播放承载H.264裸流的UDP

 

[plain] view plain copy
  1. ffplay -f h264 udp://233.233.233.223:6666  

 

注:需要使用-f说明数据类型是H.264

播放的时候可以加一些参数,比如-max_delay,下面命令将-max_delay设置为100ms:

 

[plain] view plain copy
  1. ffplay -max_delay 100000 -f h264 udp://233.233.233.223:6666  

 

1.3. 发送MPEG2裸流至组播地址

下面的命令实现了读取本地摄像头的数据,编码为MPEG2,发送至地址udp://233.233.233.223:6666。

 

[plain] view plain copy
  1. ffmpeg -re -i chunwan.h264 -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666  

 

1.4.  播放MPEG2裸流

指定-vcodec为mpeg2video即可。

 

[plain] view plain copy
  1. ffplay -vcodec mpeg2video udp://233.233.233.223:6666  

 

2.      RTP

2.1. 发送H.264裸流至组播地址。

下面命令实现了发送H.264裸流“chunwan.h264”至地址rtp://233.233.233.223:6666

 

[plain] view plain copy
  1. ffmpeg -re -i chunwan.h264 -vcodec copy -f rtp rtp://233.233.233.223:6666>test.sdp  

 

注1:-re一定要加,代表按照帧率发送,否则ffmpeg会一股脑地按最高的效率发送数据。

注2:-vcodec copy要加,否则ffmpeg会重新编码输入的H.264裸流。

注3:最右边的“>test.sdp”用于将ffmpeg的输出信息存储下来形成一个sdp文件。该文件用于RTP的接收。当不加“>test.sdp”的时候,ffmpeg会直接把sdp信息输出到控制台。将该信息复制出来保存成一个后缀是.sdp文本文件,也是可以用来接收该RTP流的。加上“>test.sdp”后,可以直接把这些sdp信息保存成文本。

http://img.blog.csdn.net/20140730002527312?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEastSDK 开发使用zz" />

2.2. 播放承载H.264裸流的RTP。

 

[plain] view plain copy
  1. ffplay test.sdp  

 

3.      RTMP

3.1. 发送H.264裸流至RTMP服务器(FlashMedia Server,Red5等)

面命令实现了发送H.264裸流“chunwan.h264”至主机为localhost,Application为oflaDemo,Path为livestream的RTMP URL。

 

[plain] view plain copy
  1. ffmpeg -re -i chunwan.h264 -vcodec copy -f flv rtmp://localhost/oflaDemo/livestream  

 

3.2. 播放RTMP

 

[plain] view plain copy
  1. ffplay “rtmp://localhost/oflaDemo/livestream live=1”  

 

注:ffplay播放的RTMP URL最好使用双引号括起来,并在后面添加live=1参数,代表实时流。实际上这个参数是传给了ffmpeg的libRTMP的。

有关RTMP的处理,可以参考文章:ffmpeg处理RTMP流媒体的命令大全

 

4.      测延时

4.1.测延时

测延时有一种方式,即一路播放发送端视频,另一路播放流媒体接收下来的流。播放发送端的流有2种方式:FFmpeg和FFplay。

通过FFplay播放是一种众所周知的方法,例如:

 

[plain] view plain copy
  1. ffplay -f dshow -i video="Integrated Camera"  

 

即可播放本地名称为“Integrated Camera”的摄像头。

此外通过FFmpeg也可以进行播放,通过指定参数“-f sdl”即可。例如:

 

[plain] view plain copy
  1. ffmpeg -re -i chunwan.h264 -pix_fmt yuv420p –f sdl xxxx.yuv -vcodec copy -f flv rtmp://localhost/oflaDemo/livestream  

 

 

就可以一边通过SDL播放视频,一边发送视频流至RTMP服务器。

注1:sdl后面指定的xxxx.yuv并不会输出出来。

注2:FFmpeg本身是可以指定多个输出的。本命令相当于指定了两个输出。

播放接收端的方法前文已经提及,在此不再详述。



DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。那么,DirectShow能够做些什么呢?且看,DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。 

  应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系如图1所示。

http://cimg.163.com/catchpic/3/36/363719C844B6C2DFFDAB6D72C021C6BE.jpgSDK 开发使用zz" TITLE="ffmpeg SDK 开发使用zz" />

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有