打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[总结]FFMPEG视音频编解码零基础学习方法
分类: FFMPEG 2013-11-16 00:04 40403人阅读 评论(226) 收藏 举报

在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的官方网站是:http://ffmpeg.org/

编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持同步): http://ffmpeg.zeranoe.com/builds/

该网站中的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

  1. ffmpeg -i input.avi -b:v 640k output.ts  
具体的使用方法可以参考: ffmpeg参数中文详细解释

详细的使用说明(英文):http://ffmpeg.org/ffmpeg.html

1.2 ffplay.exe

ffplay是用于播放的应用程序。

一个简单的播放命令可以这样写:

播放test.avi

  1. ffplay test.avi  
具体的使用方法可以参考:ffplay的快捷键以及选项

详细的使用说明(英文):http://ffmpeg.org/ffplay.html

1.3 ffprobe.exe

ffprobe是用于查看文件格式的应用程序。

这个就不多介绍了。

详细的使用说明(英文):http://ffmpeg.org/ffprobe.html


2. ffmpeg库的使用:视频播放器

本章开始介绍使用ffmpeg的库进行开发。

2.1 ffmpeg库的配置

http://ffmpeg.zeranoe.com/builds/网站上

1.下载Dev版本,里面包含了ffmpeg的xxx.h头文件以及xxx.lib库文件。

2.下载Shared版本,里面包含了ffmpeg的dll文件。

3.将这两部分文件拷贝到VC工程下面就可以了

注:可能会出现问题,参见:FFMPEG 库移植到 VC 需要的步骤

如果不想自己手动配置,可以下载已经配置好的工程:最简单的基于FFMPEG+SDL的视频播放器

2.2 最简单的视频播放器

学习文章100行代码实现最简单的基于FFMPEG+SDL的视频播放器中的代码,这是ffmpeg做视频播放器最简单的代码了,是我自己精简出来的,已经不能再简化了,每一行都很重要。

原版是基于SDL1.2的视频播放器,后来更新了基于SDL2.0的最简单的视频播放器:最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

上述播放器使用libavformat和libavcodec两个类库完成了视频的解码工作。实际上解码工作只需要libavcodec就可以了。因此更新了一个“纯净”的解码器。该解码器只使用libavcodec完成解码工作: 最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)

ffmpeg的函数介绍:ffmpeg函数介绍

注1:播放视频或音频数据的时候会用到SDL。有关SDL可以参考:SDL介绍

         SDL参考文档:SDL GUIDE 中文译本

注2:如果想查看解码后的数据,需要用到 YUV播放器:YUV播放器源代码YUV Player Deluxe都可以

2.3 相关结构体的研究

ffmpeg的结构体之间的关系参考文章:FFMPEG中最关键的结构体之间的关系

结构体中每个变量的分析,参考文章:

FFMPEG结构体分析:AVFrame

FFMPEG结构体分析:AVFormatContext
FFMPEG结构体分析:AVCodecContext
FFMPEG结构体分析:AVIOContext
FFMPEG结构体分析:AVCodec
FFMPEG结构体分析:AVStream
FFMPEG结构体分析:AVPacket


3. ffmpeg库的使用:音频播放器

3.1 最简单的音频播放器

学习文章最简单的基于FFMPEG+SDL的音频播放器 中的代码,和最简单的视频播放器一样,这是最简单的音频播放器,每一行代码都很重要。

原版是基于SDL1.2的音频播放器,后来更新了一个基于SDL2.0的最简单的音频播放器:最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)


注:如果想要查看解码后的数据(PCM数据),需要用到Audition。

4. ffmpeg库的使用:一个真正的播放器——ffplay

4.1 真正的播放器

ffplay流程图如文章FFplay源代码分析:整体流程图 所示。ffplay代码比较复杂,但是其核心代码和100行代码实现最简单的基于FFMPEG+SDL的视频播放器 是一样的。可以两个工程结合着学习。

ffplay代码简介资料:如何用FFmpeg编写一个简单播放器

ffplay使用说明:ffplay的快捷键以及选项

ffplay已经移植到VC下的工程:ffplay_vc2005(别人做的,质量很不错)

ffplay移植到MFC下的工程,包含了简单的图形界面和一些控制按钮:ffplay播放器移植VC的工程:ffplay for MFC

上述软件的代码简介:ffplay for mfc 代码备忘

ffplay.c函数结构简单分析:ffplay.c函数结构简单分析(画图)

5. ffmpeg库的使用:编码

5.1 编码

ffmpeg编码我自己研究的不是很多,可以参考文章 :使用FFmpeg类库实现YUV视频序列编码为视频

上面那篇文章是用的类库比较旧,新版类库的的使用可以参考下面几篇文章。

图像的编码可以参考:最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)

音频的编码可以参考:最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

视频的编码可以参考:最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

HEVC(H.265)视频编码可以参考:最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))

上述编码器使用libavformat和libavcodec两个类库完成了视频的编码工作。实际上编码工作只需要libavcodec就可以了。因此更新了一个“纯净”的编码器。该编码器只使用libavcodec完成编码工作: 最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)

5.2 转码

转码实际上是先解码然后编码。

不进行转码,只进行封装格式转换的程序可参考:最简单的基于FFMPEG的封装格式转换器(无编解码)

转码程序可参考:最简单的基于FFMPEG的转码程序

比较复杂的转码程序可以参考ffmpeg.c,它移植到MFC下的工程:ffmpeg转码器移植VC的工程:ffmpeg for MFC

ffmpeg.c函数结构简单分析:ffmpeg.c函数结构简单分析(画图)


6. ffmpeg源代码分析

通晓了ffmpeg库的使用以后,可以看一下ffmpeg的源代码。注意ffmpeg的源代码只有在linux下才能编译,在windows下可以使用MinGW进行编译。推荐使用Eclipse查看ffmpeg的源代码。

有一个很完整的ffmpeg源代码的分析文档:ffdoc

ffmpeg源代码分析文章列表如下。

库函数分析:

图解FFMPEG打开媒体的函数avformat_open_input

ffmpeg 源代码简单分析 : av_register_all()
ffmpeg 源代码简单分析 : avcodec_register_all()
ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg 源代码简单分析 : avcodec_decode_video2()
FFMPEG源码分析:avformat_open_input()(媒体打开函数)

ffmpeg.exe源代码分析:

ffmpeg源码分析:transcode_init()函数
ffmpeg源码分析:transcode()函数

7.FFmpeg其它几个类库的使用

7.1.libavfilter(加特效)

AVFilter可以给视音频添加各种滤镜效果。有一个简单的例子,是给视频添加水印:

最简单的基于FFmpeg的AVfilter例子(水印叠加)

7.2.libavdevice(读设备)

AVDevice可以读取电脑的多媒体设备的数据,或者输出数据到指定的多媒体设备上。

直接使用ffmpeg.exe命令行工具的文章:FFmpeg获取DirectShow设备数据(摄像头,录屏)

编程方面做了2个有关的例子:

读取摄像头:最简单的基于FFmpeg的AVDevice例子(读取摄像头)

屏幕录制:最简单的基于FFmpeg的AVDevice例子(屏幕录制)

7.3.libswscale(图像拉伸,像素格式转换)

Swscale类库可以转换像素数据的格式,同时可以拉伸图像的大小。

libswscale的使用示例: 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)

此外,这个示例还附带了一个程序,用于生成测试图片: 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具

8.FFmpeg封装格式的处理

使用FFmpeg进行封装格式的处理,主要是通过AVFormat完成。有关封装格式的处理,做了3个例子:

封装格式转换器:最简单的基于FFMPEG的封装格式转换器(无编解码)

视音频分离器简化版(demuxer-simple):最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

视音频分离器(demuxer):最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)

视音频复用器(muxer):最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

9.FFmpeg流媒体方面的应用

使用FFmpeg进行流媒体方面的应用,主要是流媒体的发送和接收。

直接使用ffmpeg.exe命令行工具的文章:

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

编程方面做了一个例子:

基于FFmpeg的推流器:最简单的基于FFmpeg的推流器(以推送RTMP为例)


10.FFmpeg的其他杂项

使用FFmpeg读写内存(而非文件)的例子:

内存播放器:最简单的基于FFmpeg的内存读写的例子:内存播放器

内存转码器:最简单的基于FFmpeg的内存读写的例子:内存转码器


11. ffmpeg相关工程的学习

学习完成ffmpeg,还可以了解一下基于ffmpeg的相关的多媒体开源工程,在这里推荐以下几个:

11.1 ffdshow

ffdshow是基于ffmpeg的解码器类库libavcodec的DirectShow Filter。广泛安装在PC上。


有关ffdshow的源代码分析文章(更新中):

ffdshow 源代码分析1 : 整体结构
ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)
ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)
ffdshow 源代码分析 5: 位图覆盖滤镜(总结)
ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)
ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)
ffdshow 源代码分析 9: 编解码器有关类的总结

11.2 LAV filters

LAV Filter是基于ffmpeg的解码器类库libavcodec,以及解封装器类库libavformat的DirectShow Filter。广泛安装在PC上。

有关LAV Filter的源代码分析文章:

LAV Filter 源代码分析 1: 总体结构

LAV Filter 源代码分析 2: LAV Splitter

LAV Filter 源代码分析 3: LAV Video (1)

LAV Filter 源代码分析 4: LAV Video (2)


11.3 Mplayer

Mplayer是Linux下使用最广泛的播放器,也有Windows版本的。其中使用了ffmpeg。


有关Mplayer的源代码分析文章:

MPlayer源代码分析

11.4 Media Player Classic - HC

现在广为使用很多播放器都是构建于Media Player Classic - HC的基础之上的。


有关Media Player Classic - HC的源代码分析文章:

Media Player Classic - HC 源代码分析 1:整体结构
Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)
Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)
Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)
Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)
Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)
Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)

11.5 XBMC

XBMC是一个优秀的自由和开源的(GPL)媒体中心软件。


有关XBMC源代码分析文章:

XBMC源代码分析 1:整体结构以及编译方法

XBMC源代码分析 2:Addons(皮肤Skin)

XBMC源代码分析 3:核心部分(core)-综述

XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)

XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)

XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)

XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)



181
0
主题推荐
应用程序 暴风影音 多媒体 摄像头 对话框
猜你在找
查看评论
95楼 YYSSFFAALLOO 昨天 11:02发表 [回复]
本科菜鸟想问一下,ffmpeg怎么把视频切成一帧一帧的图片啊
94楼 airushaonian074 5天前 21:43发表 [回复]
雷博士:之前的一个av_gettime的函数,在最新的2.6.1里面怎么找不到了
93楼 baidu_26811317 2015-03-23 18:10发表 [回复]
hhhhhhh
92楼 浪迹人生-running 2015-03-15 16:01发表 [回复]
雷博士,我想移植FFmpeg到Eclipse 开发安卓端的播放器,用来解码板子通过RTP协议采集的JPEG格式的码流,想知道FFmpeg支持这个用法吗,一般都会用到什么函数呢?刚开始学习FFmpeg,谢谢!
91楼 lihongyang1 2015-03-08 10:27发表 [回复]
博主 非常喜欢您写的文章 您好我是刚接触ffmpeg的研究生小白 请问为什么安在windows的ffmpeg里面ffmpeg.exe,ffplay.exe,ffprobe.exe三个应用程序一打开就闪退呢? 必须得在Linux系统下操作吗?
Re: 雷霄骅 2015-03-10 18:31发表 [回复]
回复lihongyang1:不是,你需要先打开“附件->命令提示符”,用DOS命令切换到ffmpeg.exe所在的目录,才能使用~
90楼 xiegenwendada 2015-03-07 04:34发表 [回复]
大神 我就问一下 给YUV文件编码成H264 只需要libavcodec库吗?为什么你的程序 pCodec = avcodec_find_encoder(codec_id) 总返回空啊 意思是没有H264编码器 有点郁闷 是不是还要装个编码器?
Re: 雷霄骅 2015-03-10 18:25发表 [回复]
回复xiegenwendada:嗯,你要确定你使用的FFmpeg里面是否有x264编码器。
我做的demo里面应该是有的。
89楼 sinat_24734257 2015-01-29 17:47发表 [回复]
有个问题想请教一下,就是我使用ffmpeg命令获取rtsp流,然后转换成rtmp再播放,我使用的命令:ffmpeg -rtsp_transport tcp -i rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp -f flv -r 25 -s 640x480 -an rtmp://localhost/myapp/stream1。但有错误:Unrecognized option 'rtsp_transport'。想问一下这是什么问题??
Re: 雷霄骅 2015-02-15 20:56发表 [回复]
回复sinat_24734257:rtsp_transport这个选项我挺早之前用过,难道是选项的名称改变了?
88楼 liang_168 2015-01-20 17:40发表 [回复]
你好 请问版主
ffmpeg 是否可以这样做?
从usb camera 读影像声音后,转成网络串流给区网内使用VLC Play 播放?
如果可以,是否可提示如何实作

谢谢
Re: 雷霄骅 2015-02-15 20:33发表 [回复]
回复liang_168:可以的。
程序开发的话,以视频为例(音频流一模一样):
libavdevice通过dshow获取视频->解码为YUV420P->编码为H.264->视音频复用->协议发送(RTP/UDP等)
这些环节我做过一些demo你参考一下把它们连接起来就可以了。
用ffmpeg.exe命令行的话,一句话应该可以搞定,你可以查一下相关的命令。
87楼 sharon686 2015-01-16 15:54发表 [回复]
正一筹莫展的时候看到这篇博客真的好好好好好好好开心!!!
Re: 雷霄骅 2015-02-15 20:25发表 [回复]
回复sharon686:哈哈,谢支持啦~
86楼 xielingsunsenergy 2015-01-15 21:24发表 [回复]
楼主请问你有关于android的NDK,Cygwin,CDT,Sequoyah的有关软件吗?现在急需它们学习。有的话能网盘共享吗?我的百度云盘号为xl12345999。希望有这些得到分享。谢谢。
Re: 雷霄骅 2015-02-15 20:24发表 [回复]
回复xielingsunsenergy:这几个官网都能下载最新版本吧。。
85楼 xielingsunsenergy 2015-01-13 21:45发表 [回复]
楼主请问一下,ffmpeg怎样移植到eclipse下编程的android应用中?希望楼主能及时解答。谢谢了。
Re: 雷霄骅 2015-02-15 20:18发表 [回复]
回复xielingsunsenergy:这方面还没有研究过,以后也想找时间看看~
84楼 xielingsunsenergy 2015-01-13 16:55发表 [回复]
感谢博主分享,很受用,正在学习关于视频传输的知识
Re: 雷霄骅 2015-02-15 20:17发表 [回复]
回复xielingsunsenergy:谢谢支持,互相学习!
83楼 ericjunbin 2014-12-27 12:34发表 [回复]
谢谢楼主分享,近期正在学习。
Re: 雷霄骅 2015-02-15 20:17发表 [回复]
回复u012422688:谢谢支持,互相学习
82楼 翛然翾飞 2014-12-12 11:43发表 [回复]
楼主你好,我用ffmpeg sdk做H264编码,要怎么设置参数才能固定码率,ffmpeg是最新版本。求指教,非常感谢!
Re: 雷霄骅 2015-02-15 21:05发表 [回复]
回复xushijie658:完全的CBR我还没有看过,不太了解。。
81楼 亞鬥 2014-12-12 09:30发表 [回复]
楼主,你好!
咨询一个问题,我要实现一个功能:将只有视频和只有音频的两个文件合并成一个文件。命令行是ffmpeg.exe -i 1.avi -i 2.wav 3.avi,请问sdk开发的话有没有相关例子资料可以参考。
我自己实现的有点问题,文件之前只有20s,合并后变成1min,而且音视频似乎不同步。
感谢!
Re: 雷霄骅 2015-02-15 21:01发表 [回复]
回复windowpos:这方面我经验也不多。。
80楼 leilei123nuli 2014-12-04 11:32发表 [回复]
楼主无私,学ffmpeg的时候很有用
Re: 雷霄骅 2015-02-15 20:14发表 [回复]
回复leilei123nuli:谢谢支持,互相学习
79楼 wangjj_java 2014-11-26 18:15发表 [回复]
感谢楼主大大的无私奉献精神,帮助我们这些刚学习编解码的菜鸟
Re: 雷霄骅 2015-02-15 20:13发表 [回复]
回复wangjj_java:互相学习!
78楼 ruixiang6 2014-11-23 18:35发表 [回复]
这是我见过的最好的关于ffmpeg的博客,感谢博主的经验分享和开源精神!
后面可能要做关于HEVC的TS封装和传输相关的工作,如果博主时间允许,希望能写一下这方面的经验文章,谢谢!
Re: 雷霄骅 2014-12-12 23:23发表 [回复]
回复ruixiang6:谢支持,下一步也会研究x265相关的内容,会继续更新的~
77楼 zcs独裁者 2014-11-17 17:14发表 [回复]
才开始学习,准备写一个简单的播放器 看了 感觉很有用
Re: 雷霄骅 2014-11-17 23:13发表 [回复]
回复u012046379:希望能帮上忙~
76楼 ufocode 2014-11-14 12:09发表 [回复]
您好,雷博,在您的专栏里,系统的学习了很多流媒体的知识,感谢。另外,我有几个问题向您咨询:
1、如果客户端通过某种方式向服务器端(基于TCP)的两个端口,一个用于发接收音频,一个用于接收视频。服务器端在接收到这两股流后,经过复用再推到一个流媒体服务器(wowza)。这个过程是不是可以参考您写的关于读取和播放内存视频流的方式来处理。整个编解的流程是什么样的呢。客户端通过网络传过来的数据,是不是还需要解包呢。如果遇到网速不理想的情况下,服务器端是不是还需要考虑缓存的问题,组到完整的包再推给流媒体服务器。

2、我在用FFMPEG在做视频编辑的时候(裁切,合并),当一个视频经过多次编辑后,发现视频文件就不完整了(主要体现在。flash播放器播放的时候,前面有几秒钟是黑屏,但有声音。而且再多编辑几次,视频的结束时间(播放器显示的时长),与实际的结束时间不一致。视频可能就提前播放完了,但进度条显示还有几秒。),编辑的视频主要是flv格式的。会跟这个有关系吗?因为视频是通过ffmpeg录制下来的,为方便web端播放时拖动。用yamidi加过关键帧。会跟这个有关吗?

3、另外就是,保证直播流的质量,应该从哪些方面入手呢?

期待你的回复,多谢!
Re: 雷霄骅 2014-11-16 23:35发表 [回复]
回复ufocode:你好啊~这几个问题分别回答下:
1.这个可以参考读写内存的例子,再参考一下《Streamer》,《Muxer》的例子,合起来应该就可以完成。服务器端不需要解码,复用后用RTMP发送出去。
2.这个情况不太了解。可以先把出问题的视频解码成YUV(或者其他方法)看看视频本身深的数据有没有受损。如果数据没有受损,就有可能是时间戳的问题。
3.这个指的是画质?还是播放的时延呢?
75楼 fgd1987 2014-11-07 14:08发表 [回复]
真的感谢博主的奉献精神,必须得赞!!
Re: 雷霄骅 2014-11-13 13:24发表 [回复]
回复fgd1987:谢支持,互相学习~
74楼 tianzhaixing 2014-11-04 21:39发表 [回复]
博主好强大~向你学习ing~
Re: 雷霄骅 2014-11-07 00:47发表 [回复]
回复tianzhaixing:互相学习了~
73楼 www_elesos_com站长 2014-11-01 16:04发表 [回复]
博主再接再厉,再发好文章.
by www.elesos.com 站长
Re: 雷霄骅 2014-11-01 17:52发表 [回复]
回复hnrayer:谢支持 ^_^
72楼 u011280046 2014-10-30 16:53发表 [回复]
真心觉得好,一个没有接触过这个方面的软件工程师,读完这些资料后,基本上可以上手
Re: 雷霄骅 2014-11-01 17:52发表 [回复]
回复u011280046:谢支持哈~
71楼 543133067qq 2014-10-23 14:08发表 [回复]
楼主你好,请问你用的是哪个版本的ffmpeg库,我现在用SDK3.2版本发现好多函数与楼主的不同。
Re: 雷霄骅 2014-10-24 10:18发表 [回复]
回复u012715390:你那个貌似比较早,我用的就是近期的了~
Re: 543133067qq 2014-10-27 17:01发表 [回复]
回复leixiaohua1020:谢谢,我已经改用最新的库了!
70楼 子期 2014-10-21 14:32发表 [回复]
楼主,你好,有个问题想请教下

ffmpeg -i tmp/pid_176/id_1/tmp.ts -c copy -map 0 -f segment -segment_list tmp.m3u8 -segment_time 10 debris

这个命令是用来视频切片的
但是我的执行后却报错了,信息如下
Duration: 00:00:08.59, start: 1.508278, bitrate: 489 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 400x224 [SAR 1:1 DAR 25:14], 15 fps, 15 tbr, 90k tbn, 30 tbc
Stream #0:1[0x101]: Audio: mp3 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, s16p, 128 kb/s
Output #0, segment, to 'debris':
Metadata:
encoder : Lavf55.43.100
Stream #0:0: Video: h264 ([27][0][0][0] / 0x001B), yuv420p, 400x224 [SAR 1:1 DAR 25:14], q=2-31, 15 fps, 90k tbn, 15 tbc
Stream #0:1: Audio: mp3 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?): Muxer not found
不知是何原因
Re: 雷霄骅 2014-10-24 10:17发表 [回复]
回复u010436037:切片这块还没有研究过,不太了解~
69楼 booooooo 2014-10-20 16:29发表 [回复]
原视频文件asf格式 - 编码方式:H.264,比特率536.63kbps。
转换成FLV视频
1.用你的ffmpegmfc选外部转码
- 转换后文件参数--编码方式:FLV,比特率800 。清晰度较差。
2.用格式工厂软件转码
- 转换后文件参数--编码方式:FLV,比特率530。清晰度很好。
文件大小格式工厂还小一些。
请教下这个清晰度怎么处理。
可以的话博主留个邮箱我把原视频发给您
Re: 雷霄骅 2014-10-21 01:19发表 [回复]
回复booooooo:分辨率是多少?你用格式工厂是否改变了分辨率呢?
Re: booooooo 2014-10-22 10:05发表 [回复]
回复leixiaohua1020:分辨率没有改变的,转换后都和原视频一样1280*720
Re: 雷霄骅 2014-10-24 10:15发表 [回复]
回复booooooo:主要是格式工厂和ffmfc内部使用的都是libx264,按理说应该没有区别的
Re: booooooo 2014-10-28 13:50发表 [回复]
回复leixiaohua1020:能留个邮箱,我把视频发给你,亲自试下可否
68楼 武溪嵌人 2014-10-16 15:02发表 [回复]
最近在搞音频流的解码工作,博主这篇文章,我只能说,特好,向大牛致敬!
Re: 雷霄骅 2014-10-21 01:17发表 [回复]
回复zdf511391565:有空多互相学习!
67楼 linkpark_123 2014-10-12 23:19发表 [回复]
请问下,ffmpeg 可以获取音频设备的数据吗?
Re: 雷霄骅 2014-10-21 01:17发表 [回复]
回复linkpark_123:可以啊,通过libavdevice
66楼 冰__蓝 2014-10-09 09:03发表 [回复]
你好,新手请教个问题,就是自己编译的ffmpeg中,有两种.a文件,如libavcodec.dll.a 和 libavcodec.a , 请问这两个文件什么区别?
Re: 雷霄骅 2014-10-21 01:16发表 [回复]
回复ling620:libavcodec.a是静态库,至于libavcodec.dll.a我也不是很清楚,dll的导入库?
65楼 kite_sky 2014-09-28 19:13发表 [回复]
博主,你好,我在写一个嵌入式的摄像头录制程序,移植了ffmpeg,运行了可以录制,但是无法高清(720p)采集,本也想着自己做一遍整体的工作,只是做到了采集到帧图片(YUV或jpg格式),不知道该怎样存储成视频。博主在ffmpeg功力深厚,望指点一二 >-<
Re: 雷霄骅 2014-10-06 01:18发表 [回复]
回复kite_sky:采集到YUV之后,就可以编码了~如果是编码成H.264的话,可以参考:
《 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)》
64楼 lianghongge 2014-09-26 16:49发表 [回复]
非常感谢,学习了!!!!!!!!!!
Re: 雷霄骅 2014-10-06 01:16发表 [回复]
回复lianghongge:多谢支持,互相学习~
63楼 零凌灵 2014-09-19 18:34发表 [回复]
谢谢大师
Re: 雷霄骅 2014-10-06 01:15发表 [回复]
回复ren65432:多谢支持,互相学习~
62楼 冥牙 2014-09-11 15:25发表 [回复]
谢谢楼主
Re: 雷霄骅 2014-10-06 01:15发表 [回复]
回复ever_best:多谢支持,互相学习~
61楼 在下个路口 2014-08-25 21:37发表 [回复]
楼主你好,请教一个问题:怎么把一张图片插入视频指定的时间。比如我要把一张图片插到第6秒的时候,然后再重新合成一个新视频。这样可以实现吗?
Re: 雷霄骅 2014-08-26 15:25发表 [回复]
回复u010941017:嗯,这样是可以的,应该是需要重新编码的。你把视频和那张图片都解码成YUV,然后把图片的YUV插入其中,然后再编码就可以了
60楼 sdqfjlp123456 2014-08-23 16:25发表 [回复]
谢谢
Re: 雷霄骅 2014-08-24 23:04发表 [回复]
回复sdqfjlp123456:谢支持~
59楼 u010421898 2014-08-21 14:57发表 [回复]
谢谢你,给你留一个言。我从20天前才接触软件编程。现在要需要进行视频编解码转换,花了12天自己看ffmpeg都没看懂。就大一的时候接触过C语言,谢谢博主了。
Re: 雷霄骅 2014-08-23 10:21发表 [回复]
回复u010421898:加油加油!希望对你能有帮助啊,有啥问题多交流~
Re: u010421898 2014-08-24 10:07发表 [回复]
回复leixiaohua1020:已私信您
58楼 骑着骑着老虎的狐狸 2014-07-27 00:45发表 [回复]
非常感谢博主的分享!真的很好!我用其中的例子从mp3文件中解码出数据放入pcm文件中fwrite(pFrame->data[0], 1, pFrame->linesize[0], pFile); 有声音但是声音不对,这是怎么回事啊?
Re: 骑着骑着老虎的狐狸 2014-07-27 17:56发表 [回复]
回复A243387337:解mp3的时候是双通道只用fwrite(pFrame->data[0], 1, pFrame->linesize[0], pFile);这一次吗?我解出来的pcm文件只有播放时只有设置为单通道才能正确听到声音。
Re: 雷霄骅 2014-07-27 21:30发表 [回复]
回复A243387337:音频解码这块最近没有怎么看,记忆有点模糊了,但是你说是双声道的话,解码后是不是有可能一个声道存储在pFrame->data[0]里面,另一个声道存储在pFrame->data[1]里面呢?这个你再看一下pFrame->data[1]里面有没有数据,有的话输出一下,看看是不是另一个声道的内容。
Re: 骑着骑着老虎的狐狸 2014-07-28 10:59发表 [回复]
回复leixiaohua1020:数据倒是有我用fwrite(pFrame->data[1], 1, pFrame->linesize[0], pFile);写到文件中结果和data[0]一模一样然后我用fwrite(pFrame->data[0], 1, pFrame->linesize[0], pFile);fwrite(pFrame->data[1], 1, pFrame->linesize[0], pFile);生成的pcm文件播的时候声音就不对了,44.1K×16×2/8 * 223(3分43秒的mp3文件)算出来解出来应该有39M,只用一个fwrite写文件大小只有19M,求大神指导!!
Re: 雷霄骅 2014-07-30 01:49发表 [回复]
回复A243387337:这么看的话pFrame->data[0]和pFrame->data[1]应该分别存储的是两个声道的数据了。你这个先写一个声道然后再写另一个声道的方式应该不对吧~你看一下WAV或者PCM的存储方式,应该是左右声道交错存储的吧~
PS:你这个fwrite(pFrame->data[1], 1, pFrame->linesize[0], pFile)中的pFrame->linesize[0]应该是pFrame->linesize[1]
57楼 Ravi1982 2014-07-20 17:10发表 [回复]
非常感谢博主的分享!
我是ffmpeg的初学者,有问题想请教。
我在使用avcodec_encode_video2()编码,当第一次got_picture==1时,得到的第一个包size值非常大,后面再got_picture==1时,得到的包就比较小,比第一个包小10到100倍。
与之相对,使用av_read_frame(),当第一次got_picture==1时,得到的包也非常大。
我的问题是:为什么第一个包会比后续的包大出那么多呢?
拜请高人解答,谢谢!
Re: 雷霄骅 2014-07-22 00:42发表 [回复]
回复Ravi1982:你好啊,码流中第一帧一般情况下应该是I帧吧,I帧是帧内预测帧,体积相对来说会大很多。码流后面的帧一般是参考的前面(或后面)的帧,体积自然就比较小了。看看这个:
《 视频压缩编码和音频压缩编码的基本原理》
Re: Ravi1982 2014-07-22 15:52发表 [回复]
回复leixiaohua1020:你好,雷博士。
最初我也认为可能是I帧的缘故。可随后的包没有一个能达到第一个包那么大的程度,如果是I帧造成的,后面应该还有I帧的。是不是第一个包里包含了其他什么信息呢,我实验用的视频编码是H264。我对视频编码技术还是个门外汉,工作需要正在学习,呵呵!
Re: 雷霄骅 2014-07-22 21:27发表 [回复]
回复Ravi1982:你说的是got_picture==1的时候的AVPacket体积比较大?这个我不能很确定,但我印象中应该是I帧。建议你把AVPacket中的码流数据写成文件,然后拿H.264的码流分析工具看一下吧~
56楼 Jane_1990 2014-07-17 11:15发表 [回复]
非常感谢楼主,感觉我学习ffmpeg有希望了!
Re: 雷霄骅 2014-07-18 23:59发表 [回复]
回复Jane_1990:希望能帮上忙~
55楼 Danny_姜 2014-07-16 11:53发表 [回复]
神人~ 请教一个问题^_^
我现在想用FFMpeg做一个android的客户端,具体功能是将手机中的多张图片合并成一个小视频 并能够添加水印效果 请问楼主这方面有了解吗
Re: 雷霄骅 2014-07-16 17:15发表 [回复]
回复zxm317122667:嗯,可以实现~
先将图片分别解码成YUV,然后连在一起,叠加水印,最后编码为视频
Re: Danny_姜 2014-07-24 17:20发表 [回复]
回复leixiaohua1020:楼主~感谢你的回复~ 还有不太明白的 安卓上层是用java, 我需要用将FFMpeg编译成so库文件, 然后调用JNI来调用 实现吗?
Re: 雷霄骅 2014-07-24 23:55发表 [回复]
回复zxm317122667:不用,这样虽然也能达到效果,但是成本太高了。我觉得你先试试直接调用ffmpeg.exe吧,会简单非常多。
54楼 视频摘要 2014-07-14 21:45发表 [回复]
分享我的最新ffmpegSDK(2014.7.8)的简单播放器,链接如下http://url.cn/ME1c6O
Re: 雷霄骅 2014-07-16 17:12发表 [回复]
回复dingf350783240:多交流,互相学习了~
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
考研辅助app的诞生!
零基础读懂视频播放器控制原理: ffplay 播放器源代码分析
音视频开发---音视频同步算法
FFmpeg实战:ffplay介绍及入门使用
转:Android上ffmpeg移植(3)
FFMPEG 源码分析(
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服