`
chriszeng87
  • 浏览: 736890 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. ffmpeg -i input.avi -b:v 640k output.ts  

具体的使用方法可以参考: ffmpeg参数中文详细解释

 

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

1.2 ffplay.exe

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

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

播放test.avi

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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)

 

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))

 

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例子(屏幕录制)

 

 

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为例)

 

转自:http://blog.csdn.net/leixiaohua1020/article/details/15811977

分享到:
评论

相关推荐

    FFMPEG3.4视音频编解码代码库.rar

    FFmpeg是一款开源的跨平台多媒体处理工具,广泛用于视频、音频的编码、解码、转换、流媒体处理等任务。3.4版本是FFmpeg的一个重要...无论你是哪种角色,FFmpeg3.4视音频编解码代码库都是一份宝贵的资源,值得深入探索。

    ffmpeg 视音频变解码

    视音频编解码,实现多媒体播放使用,对于嵌入式或应用开发都有用

    《FFmpeg视、音频解码》源码+视频文件

    本资源包含的是一个使用FFmpeg进行视、音频解码的示例,帮助开发者了解如何在Android环境中集成并应用FFmpeg。 首先,让我们深入理解FFmpeg的核心概念。FFmpeg库由多个组件组成,包括libavcodec(编码和解码库)、...

    ffmpeg视音频解码【一】的SourceCode

    多媒体的时代,得多了解点编解码的技术才行,而ffmpeg为我们提供了一系列多媒体编解码的接口,如何用好这些接口达到自己所需要的目的,这也是一门重要的学问。 要是了解得不够,总是会遇到一堆又一堆问题;网上关于...

    ffmpeg+sdl视音频播放器

    ffmpeg+sdl播放器解码视音频,使用ffmpeg-2.5.2+SDL-1.2.15,参考ffmpeg官方例子,欢迎交流 内含10个工程 1.保存为bmp图片 2.解码视频 3.解码视频, 音频 4.分离代码,加入线程(伪同步) 5.视频同步到音频 6.音频同步到...

    ffmpeg+sdl2视音频播放器

    ffmpeg+sdl2播放器解码视音频,使用ffmpeg-2.5.2+SDL2-2.0.3,如有bug或建议,欢迎交流 内含5个工程 1.保存为bmp图片 2.解码视频 3.解码视音频 4.分离代码,加入线程(伪同步) 5.视音频同步,快进快退功能,播放/暂停...

    Visual C++音视频编解码技术及实践,音视频编解码基础知识,C/C++

    本文将详细探讨在Visual C++中进行音视频编解码的基础知识,以及如何通过C/C++编程实践这些技术。 首先,音视频编解码是数字媒体处理的核心部分,它涉及到音频和视频信号的数字化、压缩与解压缩过程。在编码阶段,...

    模块化视音频同步版本.zip_ffmpeg audio video_ffmpeg video audio_ffmpeg播放器_视

    在这个“模块化视音频同步版本.zip”中,我们聚焦于FFmpeg如何实现音视频同步以及其在Windows平台上的应用。 首先,音视频同步是多媒体播放中的关键环节,确保音频和视频在播放时保持一致,避免出现声音与画面不...

    利且ffmpeg解析视音频文件中的时间戳

    FFmpeg是一款强大的开源工具,广泛应用于音视频处理领域,包括编码、解码、转换和流媒体操作。在处理音视频文件时,理解时间戳的概念至关重要,尤其是PTS(Presentation Timestamp)和DTS(Decoding Timestamp)。这...

    simplest_mediadata_h264_ffmpegH264_ffmpeg_视音频数据处理示例_

    本示例"simplest_mediadata_h264_ffmpegH264_ffmpeg_视音频数据处理示例_"将聚焦于如何使用FFmpeg进行H.264编码的视音频数据处理。FFmpeg支持H.264,这是一种广泛应用于高清视频编码的标准,具有高效率和良好的压缩...

    FFmpeg_03_视音频流分离

    在“FFmpeg_03_视音频流分离”这个主题中,我们将重点探讨如何使用 FFmpeg 库来实现视音频流的分离,这对于处理多媒体文件,如影片或音频文件,进行编辑、转码或分析时非常关键。 首先,FFmpeg 包含了多个工具和库...

    基于 FFmpeg2.5.11 实现 g711+h264 写入 mp4 文件 ( 不支持H264编解码 )

    实现代码主要参考雷神的视音频复用器(muxer),来实现 g711+h264 写入MP4文件。 (不支持H264编解码) 雷神: https://blog.csdn.net/leixiaohua1020/article/details/39802913。

    ffmpeg大收藏 致敬雷神.pdf

    1. **视音频编解码技术概论** 2. **封装格式的理解与实践** 3. **视音频编码标准详解** 4. **视频播放器的工作原理** ### 视音频编解码技术概论 视音频编解码技术是数字多媒体领域中的核心组成部分,它涵盖了视频和...

    FFmpeg_01_视音频流封装

    FFmpeg 是一个强大的...通过这个系列,你将全面了解FFmpeg如何进行视音频流的封装,从编码、解码到最终的容器格式化,掌握C++编程在多媒体处理中的应用。学习并熟练运用FFmpeg,可以让你在音视频领域开发中游刃有余。

    linux下实现ffmpeg+sdl视音频播放

    FFmpeg是一个强大的多媒体处理工具集,包含了多种编解码器、格式转换、音视频抽取和流化等功能。而SDL则是一个跨平台的多媒体开发库,提供了图形、音频和输入设备的低级访问,使得开发者能够创建丰富的多媒体应用...

    FFmpeg API读取视音频文件信息的一个工具----MediaFileInfoList.zip

    本项目“MediaFileInfoList”利用FFmpeg的API,开发了一个具有图形用户界面的工具,专门用于读取各种格式的视音频文件信息,如MP4、AVI、MKV等。以下将详细讲解这个工具所涉及的知识点。 1. FFmpeg API:FFmpeg的...

    C#视音频分离工具

    总的来说,这个C#视音频分离工具利用了C#强大的编程能力和FFmpeg的多媒体处理能力,为用户提供了简单易用的视音频分离功能。其核心工作流程可能包括:读取源视频文件、识别和分离音频流、编码音频为MP3格式、保存...

    ffmpeg+SDL2实现的视频播放器(windows版)

    获取音频解码器,解码音频数据,然后使用 SDL2 的音频回调机制播放。音频同步可能需要更复杂的逻辑,确保音频和视频同步播放。 整个项目展示了如何将 FFmpeg 的强大功能与 SDL2 的图形处理能力结合,构建一个基本的...

Global site tag (gtag.js) - Google Analytics