ffmpeg学习ffmpeg的书籍,ffmpeg,学习ffmpeg的书籍,由于,之前,偶尔,接触,ffmpeg,没

FFMPEG视音频编解码零基础学习方法 - DoubleLi - 博客园
在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的&大神&,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一个问题:在&大神&和初学者之间好像有一个不可逾越的鸿沟。&大神&们水平高超,探讨着深奥的问题;而初学者们还停留在入门阶段。究竟是什么原因造成的这种&两极分化&呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程。现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触FFMPEG的人学习;而且很多的例子程序编译通不过,极大地打消了学习的积极性。我自己在刚开始学习FFMPEG的时候也遇到了很大的困难。为了帮助更多的人快速成为&大神&,我想总结一个学习FFMPEG的方法,方便大家循序渐进的学习FFMPEG。
0. 背景知识
本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:FFMPEG是非常重要的。
使用FFMPEG作为内核视频播放器:
Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...
使用FFMPEG作为内核的Directshow Filter:
ffdshow,lav filters...
使用FFMPEG作为内核的转码工具:
ffmpeg,格式工厂...
事实上,FFMPEG的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。
1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe)
本章主要介绍一下ffmpeg工程包含的三个exe的使用方法。
ffmpeg的官方网站是:
编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持同步):&
该网站中的FFMPEG分为3个版本:Static,Shared,Dev。
前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。
Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。
打开系统命令行接面,切换到ffmpeg所在的目录,就可以使用这3个应用程序了。
1.1 ffmpeg.exe
ffmpeg是用于转码的应用程序。
一个简单的转码命令可以这样写:
将input.avi转码成output.ts,并设置视频的码率为640kbps
ffmpeg&-i&input.avi&-b:v&640k&output.ts&&
具体的使用方法可以参考:&
详细的使用说明(英文):
1.2 ffplay.exe
ffplay是用于播放的应用程序。
一个简单的播放命令可以这样写:
播放test.avi
ffplay&test.avi&&
具体的使用方法可以参考:
详细的使用说明(英文):
1.3 ffprobe.exe
ffprobe是用于查看文件格式的应用程序。
这个就不多介绍了。
详细的使用说明(英文):
2. ffmpeg库的使用:视频播放器
本章开始介绍使用ffmpeg的库进行开发。
2.1 ffmpeg库的配置
1.下载Dev版本,里面包含了ffmpeg的xxx.h头文件以及xxx.lib库文件。
2.下载Shared版本,里面包含了ffmpeg的dll文件。
3.将这两部分文件拷贝到VC工程下面就可以了
注:可能会出现问题,参见:
如果不想自己手动配置,可以下载已经配置好的工程:
2.2 最简单的视频播放器
学习文章《》中的代码,这是ffmpeg做视频播放器最简单的代码了,是我自己精简出来的,已经不能再简化了,每一行都很重要。
ffmpeg的函数介绍:
注1:播放视频或音频数据的时候会用到SDL。有关SDL可以参考:
& & & & &SDL参考文档:
注2:如果想查看解码后的数据,需要用到 YUV播放器:或都可以
2.3 相关结构体的研究
ffmpeg的结构体之间的关系参考文章:
结构体中每个变量的分析,参考文章:
3. ffmpeg库的使用:音频播放器
3.1 最简单的音频播放器
学习文章《》&中的代码,和最简单的视频播放器一样,这是最简单的音频播放器,每一行代码都很重要。
注:如果想要查看解码后的数据(PCM数据),需要用到Audition。
4. ffmpeg库的使用:一个真正的播放器&&ffplay
4.1 真正的播放器
ffplay流程图如文章《》&所示。ffplay代码比较复杂,但是其核心代码和《》&是一样的。可以两个工程结合着学习。
ffplay代码简介资料:
ffplay使用说明:
ffplay已经移植到VC下的工程:(别人做的,质量很不错)
ffplay移植到MFC下的工程,包含了简单的图形界面和一些控制按钮:
5. ffmpeg库的使用:编码
ffmpeg编码我自己研究的不是很多,可以参考文章&:
上面那篇文章是用的类库比较旧,新版类库的的使用可以参考下面几篇文章。
图像的编码可以参考:
音频的编码可以参考:
视频的编码可以参考:
转码实际上是先解码然后编码。
不进行转码,只进行封装格式转换的程序可参考:
转码程序可参考:
比较复杂的转码程序可以参考ffmpeg.c,它移植到MFC下的工程:
6. ffmpeg源代码分析
通晓了ffmpeg库的使用以后,可以看一下ffmpeg的源代码。注意ffmpeg的源代码只有在linux下才能编译,在windows下可以使用MinGW进行编译。推荐使用Eclipse查看ffmpeg的源代码。
有一个很完整的ffmpeg源代码的分析文档:
ffmpeg源代码分析文章列表如下。
库函数分析:
ffmpeg.exe源代码分析:
7. ffmpeg相关工程的学习
学习完成ffmpeg,还可以了解一下基于ffmpeg的相关的多媒体开源工程,在这里推荐以下几个:
7.1 ffdshow
ffdshow是基于ffmpeg的解码器类库libavcodec的DirectShow Filter。广泛安装在PC上。
有关ffdshow的源代码分析文章(更新中):
7.2 LAV filters
LAV Filter是基于ffmpeg的解码器类库libavcodec,以及解封装器类库libavformat的DirectShow Filter。广泛安装在PC上。
有关LAV Filter的源代码分析文章:
7.3 Mplayer
Mplayer是Linux下使用最广泛的播放器,也有Windows版本的。其中使用了ffmpeg。
有关Mplayer的源代码分析文章:
7.4 Media Player Classic - HC
现在广为使用很多播放器都是构建于Media Player Classic - HC的基础之上的。
有关Media Player Classic - HC的源代码分析文章:
from:http://blog.csdn.net/leixiaohua1020/article/details/
XBMC是一个优秀的自由和开源的(GPL)媒体中心软件。
有关XBMC源代码分析文章:
8.FFmpeg其它方面的功能
在这里介绍一下FFmpeg中AVFilter的使用。AVFilter可以给试饮品添加各种处理效果。有一个简单的例子,是给视频添加水印:最安全的绿色软件下载基地!
扫码浏览手机端页面
热门搜索:
您的位置:
ffmpeg前端(FFMpeg Drive) 1.0a 免费版
网友评分:6.9 分
软件星级:
软件大小:18M
软件语言:英文
软件分类:媒体制作
软件授权:免费软件
更新时间:
软件类别:国外软件
软件官网:/
应用平台:Win All
软件标签:
ffmpeg前端(FFMpeg Drive) 1.0a 免费版
高速下载通道:其它下载通道:
可能感兴趣的软件
(您的评论需要经过审核才能显示)
共0人参与,0条评论
17.3M / 简体中文 / 6.9152M / 简体中文 / 6.131.2M / 简体中文 / 8.7187M / 简体中文 / 6.44.7M / 简体中文 / 0.01.33G / 简体中文 / 1.537.9M / 简体中文 / 9.7
分类下载排行
01会声会影X5下载 官方破解版01媒体制作 / 1.33G02EDIUS v6.52 官方简体中文完整破解版02媒体制作 / 339M03Adobe Premiere Pro CS4 V4.21 官方版03媒体制作 / 152M04数码大师免费版下载(附注册码) 最新版04媒体制作 / 43.4M05Adobe AE CS4 中文版下载 9.0.1绿色版05媒体制作 / 150M06After Effects CS4中文版下载 官方正式版06媒体制作 / 1.27G07会声会影X5注册机(序列号) 绿色版07媒体制作 / 206KB08Sony Vegas Pro 13.0.0453 中文绿色版08媒体制作 / 397M09绘声绘影x4简体中文免费破解版下载09媒体制作 / 767M10sony vegas中文版 v13.0.453 官方版10媒体制作 / 397M
01会声会影X5下载 官方破解版01媒体制作 / 1.33G02EDIUS v6.52 官方简体中文完整破解版02媒体制作 / 339M03Adobe Premiere Pro CS4 V4.21 官方版03媒体制作 / 152M04数码大师免费版下载(附注册码) 最新版04媒体制作 / 43.4M05Adobe AE CS4 中文版下载 9.0.1绿色版05媒体制作 / 150M06After Effects CS4中文版下载 官方正式版06媒体制作 / 1.27G07会声会影X5注册机(序列号) 绿色版07媒体制作 / 206KB08Sony Vegas Pro 13.0.0453 中文绿色版08媒体制作 / 397M09绘声绘影x4简体中文免费破解版下载09媒体制作 / 767M10sony vegas中文版 v13.0.453 官方版10媒体制作 / 397M
起点软件 - 所有软件均来自网络如有版权问题请联系我们 - 浙ICP备号
Copyright & 2004- online services. All rights reserved.
请简要描述您遇到的错误,我们将尽快予以修订阅读(5025)
本篇将使用上节中编译好的库文件通过rtsp获取网络上的h264裸流并保存到mp4文件中。
1、VS2010建立VC++& win32控制台项目
2、在工程目录下建立lib目录和include目录,将已编译好的lib拷打lib下,include拷到include下,dll拷到Debug目录下
3、工程属性--配置属性--VC++目录--包含目录,添加ffmpeg头文件目录及其他第三方头文件目录
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 链接器--常规--附加库目录,添加lib目录
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 链接器--输入--附加依赖项,添加各个lib名
4、设计和实现:
4.1 设计思路:
&&&&&& 组件和网络初始化&&&打开网络流&&&获取网络流信息&&&根据网络流信息初始化输出流信息&&&创建并打开mp4文件&&&写mp4文件头
&&&&&&&&&&&&&&&&&&& &&&循环读取输入流并写入mp4文件&&&写文件尾&&&关闭流,关闭文件
4.2 关键数据结构:
&&&&&& AVFormatContext,AVStream,AVCodecContext,AVPacket,AVFrame等,它们的关系解释如下:
&&&&&& 一个AVFormatContext包含多个AVStream,每个码流包含了AVCodec和AVCodecContext,AVPicture是AVFrame的一个子集,
他们都是数据流在编解过程中用来保存数据缓存的对像,从数据流读出的数据首先是保存在AVPacket里,也可以理解为一个AVPacket最多只包含一个AVFrame,
而一个AVFrame可能包含好几个AVPacket,AVPacket是种数据流分包的概念。
4.3 关键函数:
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options); //打开网络流或文件流
int avformat_write_header(AVFormatContext *s, AVDictionary **options);//根据文件名的后缀写相应格式的文件头
int av_read_frame(AVFormatContext *s, AVPacket *pkt);//从输入流中读取一个分包
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);//往输出流中写一个分包
int av_write_trailer(AVFormatContext *s);//写输出流(文件)的文件尾
4.4 代码:
#include "stdafx.h"
#ifdef __cplusplus
extern "C" {
#include &libavcodec/avcodec.h&
#include &libavdevice/avdevice.h&
#include &libavformat/avformat.h&
#include &libavfilter/avfilter.h&
#include &libavutil/avutil.h&
#include &libswscale/swscale.h&
#include &stdlib.h&
#include &stdio.h&
#include &string.h&
#include &math.h&
#ifdef __cplusplus
AVFormatContext *i_fmt_
AVStream *i_video_
AVFormatContext *o_fmt_
AVStream *o_video_
int _tmain(int argc, char **argv)
avcodec_register_all();
av_register_all();
avformat_network_init();
/* should set to NULL so that avformat_open_input() allocate a new one */
i_fmt_ctx = NULL;
char rtspUrl[] = "rtsp://admin:8.10.76:554";
const char *filename = "1.mp4";
if (avformat_open_input(&i_fmt_ctx, rtspUrl, NULL, NULL)!=0)
fprintf(stderr, "could not open input file\n");
return -1;
if (avformat_find_stream_info(i_fmt_ctx, NULL)&0)
fprintf(stderr, "could not find stream info\n");
return -1;
//av_dump_format(i_fmt_ctx, 0, argv[1], 0);
/* find first video stream */
for (unsigned i=0; i&i_fmt_ctx-&nb_ i++)
if (i_fmt_ctx-&streams[i]-&codec-&codec_type == AVMEDIA_TYPE_VIDEO)
i_video_stream = i_fmt_ctx-&streams[i];
if (i_video_stream == NULL)
fprintf(stderr, "didn't find any video stream\n");
return -1;
avformat_alloc_output_context2(&o_fmt_ctx, NULL, NULL, filename);
* since all input files are supposed to be identical (framerate, dimension, color format, ...)
* we can safely set output codec values from first input file
o_video_stream = avformat_new_stream(o_fmt_ctx, NULL);
AVCodecContext *c;
c = o_video_stream-&
c-&bit_rate = 400000;
c-&codec_id = i_video_stream-&codec-&codec_
c-&codec_type = i_video_stream-&codec-&codec_
c-&time_base.num = i_video_stream-&time_base.
c-&time_base.den = i_video_stream-&time_base.
fprintf(stderr, "time_base.num = %d time_base.den = %d\n", c-&time_base.num, c-&time_base.den);
c-&width = i_video_stream-&codec-&
c-&height = i_video_stream-&codec-&
c-&pix_fmt = i_video_stream-&codec-&pix_
printf("%d %d %d", c-&width, c-&height, c-&pix_fmt);
c-&flags = i_video_stream-&codec-&
c-&flags |= CODEC_FLAG_GLOBAL_HEADER;
c-&me_range = i_video_stream-&codec-&me_
c-&max_qdiff = i_video_stream-&codec-&max_
c-&qmin = i_video_stream-&codec-&
c-&qmax = i_video_stream-&codec-&
c-&qcompress = i_video_stream-&codec-&
avio_open(&o_fmt_ctx-&pb, filename, AVIO_FLAG_WRITE);
avformat_write_header(o_fmt_ctx, NULL);
int last_pts = 0;
int last_dts = 0;
int64_t pts,
AVPacket i_
av_init_packet(&i_pkt);
i_pkt.size = 0;
i_pkt.data = NULL;
if (av_read_frame(i_fmt_ctx, &i_pkt) &0 )
* pts and dts should increase monotonically
* pts should be &= dts
i_pkt.flags |= AV_PKT_FLAG_KEY;
pts = i_pkt.
i_pkt.pts += last_
dts = i_pkt.
i_pkt.dts += last_
i_pkt.stream_index = 0;
//printf("%lld %lld\n", i_pkt.pts, i_pkt.dts);
static int num = 1;
printf("frame %d\n", num++);
av_interleaved_write_frame(o_fmt_ctx, &i_pkt);
//av_free_packet(&i_pkt);
//av_init_packet(&i_pkt);
last_dts +=
last_pts +=
avformat_close_input(&i_fmt_ctx);
av_write_trailer(o_fmt_ctx);
avcodec_close(o_fmt_ctx-&streams[0]-&codec);
av_freep(&o_fmt_ctx-&streams[0]-&codec);
av_freep(&o_fmt_ctx-&streams[0]);
avio_close(o_fmt_ctx-&pb);
av_free(o_fmt_ctx);
如上图为存储过程中程序的打印结果。生成的mp4文件可以用任意支持该格式的播放器播放。原文链接:
阅读排行榜H264 实时传输的问题,初次接触ffmpeg,请大家帮忙,谢谢了 - 视频技术论坛 - Powered by Discuz!
视频技术论坛
标题: H264 实时传输的问题,初次接触ffmpeg,请大家帮忙,谢谢了
作者: xiaosunchina& & 时间:
标题: H264 实时传输的问题,初次接触ffmpeg,请大家帮忙,谢谢了初次接触该领域,有哪里不对还请您斧正。
目标:通过网络传输实时H264 NALU数据,在客户端可以通过Sliverlight观看。
1: 对于这样的目标,是直接传送H264 NALU数据好呢,还是传送Mpeg-TS比较好呢?要求清晰,而且稳定一些。
2: 如果是传送TS数据的话,
& && & 1)那么要“解码”H264再编码&TS&吗?
& && & 2)还是可以直接从H264编码(封装)为“TS”?这样的话怎么做呢?
3: 我在用ffmpeg,在我使用下面代码得到TS编码器的时候 avcodec_find_encoder(AV_CODEC_ID_MPEG2TS);复制代码总是返回-1,也就是说没有找到MPEG2TS编码器。av_register_all();我是有声明过的。而起貌似可以使用的编码器之后H264,和MPEG1两种,是这样子的吗?
& && &在avcdoec.h里面有这样的一行: AV_CODEC_ID_MPEG2TS = 0x20000, /**& _FAKE_ codec to indicate a raw MPEG-2 TS
& && && && && && && && && && &&&* stream (only used by libavformat) */复制代码请问各位,如果想使用TS编码器的话,应该怎么办?
4:我上面的做法大概是要编码为TS,有没有其他方式能得到TS视频流呢?
5:对于实时生成视频流,应该用什么方式传输呢。可不可以大概讲解一下。
作者: firstime& & 时间:
1、是直接传送H264 NALU数据好呢,还是传送Mpeg-TS比较好呢?
——如果只是局域网上两台电脑那么可以直接传 H.264 裸流;否则还是传 RTP 流或者 TS 流比较好;
2、可以直接从H264编码(封装)为“TS”?这样的话怎么做呢?
——是的。结合 H.222 学习附件中的文档,搞清楚 TS 的码流结构;
3、如果想使用TS编码器的话,应该怎么办?
——对 FFMPEG 不熟;
4、有没有其他方式能得到TS视频流呢?
——自己封装或者找别人写好的封装代码;
5、对于实时生成视频流,应该用什么方式传输呢
作者: xiaosunchina& & 时间:
本帖最后由 xiaosunchina 于
08:25 AM 编辑
首先谢谢版主的回答,真的帮了很大的忙,谢谢
1)我这里是在广域网传输,是否RTP的效果会优于TS流呢?
2)有没有您已知的比较好用的RTP代码,或者TS,方便共享一下吗?
3)RTP是否要与RTCP联合工作才会比较可靠呢?
我在ffmpeg区也发了同样的帖子,希望不会违反规则。 :)
作者: firstime& & 时间:
1、我觉得应该用 RTP;
2、好像 NALUDecoder 可以将 H.264 码流按 RTP 发出去;
3、不需要。
作者: xjtuaiar& & 时间:
实时传输的话,用sniffer抓数据包,怎么将数据还原啊?
作者: xiaosunchina& & 时间:
我是用wireshark抓包
倒不需要还原,主要是对比一下发送数据哪里有区别
作者: xjtuaiar& & 时间:
第一次接触,很是不懂啊,求助啊!
作者: 爱你一万年& & 时间:
firstime 发表于
1、我觉得应该用 RTP;
2、好像 NALUDecoder 可以将 H.264 码流按 RTP 发出去;
3、不需要。
您好啊,看了您的几篇文章,觉得挺不错的, 我是一个学生,想学ffmpeg实时解码H264,看了好多资料,感觉很迷茫,您能给我发一下您的完整ffmpeg实时解码H26的工程文件吗,,小弟非常感谢啊!!!
作者: 爱_嘟嘟99& & 时间:
欢迎光临 视频技术论坛 (http://bbs.chinavideo.org/)
Powered by Discuz! X2.5& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区}

我要回帖

更多关于 ffmpeg学习 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信