ffmpeg 工具是一个高效快速的命令行工具,进行视音频不同格式之间的转换。

ffmpeg命令行

ffmpeg可以读取任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,由 -i 选项指定,并写入任意数量的输出“文件” (由纯输出文件名指定,在命令行中发现的不能被解释为选项的任何东西被认为是输出文件名。)

每个输入或输出文件原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。 流的数量或类型可以由容器格式规定。 选择哪些输入并输出到哪个要么自动完成,要么使用-map选项。

将输出文件的视频比特率设置为54kbit/s

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

强制输出文件的帧速率24帧:

ffmpeg -i input.avi -r 24 output.avi

强制输入文件的帧速率(仅对raw格式有效)为1帧和输出文件的帧速率为24帧的:

ffmpeg -r 1 -i input.m2v -r 24 output.avi

ffmpeg的转码流程可以由下如表示:

编码分组后传递到解码器。 解码器可以通过滤波进一步处理的未压缩帧(原始视频/ PCM音频/ ...)。 在过滤之后,帧被传递到编码器,编码它们并输出编码分组。 最后,它们被传递到复用器,复用器将编码的数据包写入输出文件。)

ffmpeg为开发者准备的库

libavutil:这是一个实用程序库,以辅助多媒体编程。它包含安全可移植字符串函数,随机生成数,数据结构,附加数学函数,加密和多媒体相关功能。它不是libavcodec和libavformat所需的代码的库。

这个库的目标是:

模块化   它应该具有很少的相互依赖性和在./configure期间禁用某个单个部件得可能性。

小          源和对象都应该很小。

高效       它应该具有低CPU和内存使用。

有用       它应该添加人们很需要的功能。

libavcodec: libavcodec库提供通用编码/解码框架,并包含用于音频,视频,和字幕流的多个解码器和编码器,以及多个比特流滤波器。

共享架构提供从比特流i/o到dsp优化的各种服务,并使得它适用于实现健壮和快速的编解码器。

libavformat:库为音频、视频和字幕流的复用和解复用(多路复用和解复用)提供了一个通用框架。它包括多媒体容器格式的多个多路复用器和多路分解器。

它还支持几种输入和输出协议来访问媒体资源。

libavdevice:提供了一个通用框架,用于从许多常见的多媒体输入/输出设备抓取和渲染,并支持多个输入和输出设备,包括Video4Linux2,VfW。DShow和ALSA。

libavfilter:提供一个通用的音频/视频过滤框架,包含几个过滤器,源和接收器模块。

libswscale:该库执行高度优化的图像缩放和颜色空间和像素格式转化操作。

具体来说,此库执行以下转换:

重新调整:更改视频大小的过程。有几个重新调整选项和算法可以。这通常是有损耗的过程。

像素格式转换:是转换图像的图像格式和颜色空间的过程,例如从平面YUV420P到RGB24转换。它还可以处理packed转换,即从packed布局(属于在同一缓冲器中交织的不同平面的所有像素)转换成平面布局(属于存储在专用缓冲器或“平面”中的相同平面的所有样本)的转换。

如果源和目标颜色空间不同,这通常是有损过程。

libswresample:此库执行高度优化的音频重采样,重新矩阵化和样本格式转换操作。

具体来说,此库执行以下转换:

重新采样:是改变音频速率的过程,例如从 44100Hz 的高采样率到 8000Hz 。从高到低采样率的音频转换是有损耗的过程。有几个重采样选项和算法可用。

格式转换:是将采样类型(例如从16位有符号采样转换为无符号8位或浮点采样)的过程。当从 packed 布局(所有属于在相同缓冲器中交错的不同通道的样本)到平面布局(属于存储在专用缓冲器或“平面”中的相同通道的所有样本)时,它还处理 packed 转换。

重新矩阵化:是改变通道布局的过程,例如从立体声到单声道。当输入通道不能映射到输出流时,该过程是有损的,因为它涉及不同的增益因子和混合。

通过专用选项启用各种其他音频转换(例如拉伸和填充)。

制作动画屏幕捕捉

电影文件有几个部分组成,文件本身称为容器,容器的类型决定文件中信息的位置。 本节实验容器的示例是 avi 和quicktime。 接下来,我们需要处理很多流:例如通常有一个音频流和一个视频流。流中的数据元素被称为帧。 每个流由不同种类的编解码器编码。 编解码器定义实际数据如何被 COTED和 DECDODE --- 因此名称 CODEC。 编解码器的示例是 DivX 和 MP3 。 然后从流中读取分组。 数据包是可以包含数据位的数据片段,这些数据被解码成我们最终可以为我们的应用程序处理的原始帧。 为了我们的目的,每个分组包含完整的帧,或者在音频的情况下多个帧。

处理视频和音频流是非常容易的,属于基本层次:

从文件中找到视频流

从视频流中读取数据包

如果不是一帧完整的数据就继续执行上一步

对帧数据做一些处理

然后循环执行以上操作,直到结束

ffmpeg结合SDL编写播放器(一)的更多相关文章

  1. ffmpeg结合SDL编写播放器

    创建播放窗口 SDL_Surface *screen = NULL; screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->heig ...

  2. ffmpeg结合SDL编写播放器(三)

    接下来是解析影片的帧 /*** project.c ***/ #include<stdio.h> #include<libavcodec/avcodec.h> #include ...

  3. ffmpeg结合SDL编写播放器(二)

    我们将对帧数据做一些处理,比如将每一帧的 图像转为jpg或者bmp或者ppm等格式保存下来. 举例:在ffmpeg-2.8.8文件夹下编写test.c程序 /* test.c */ #include& ...

  4. H.264:FFMpeg 实现简单的播放器

    H.264:FFMpeg 实现简单的播放器   FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我 ...

  5. H264-YUV通过RTP接收视频流ffmpeg解码SDL实时播放

    写在前面的话 写一个简单的播放器,通过RTP接收视频流,进行实时播放.最初,使用ffplay或者vlc接收按照SDP协议文件可以播放视频,但是视频中断后重启,不能正确的解包,时常会出现如下的错误信息. ...

  6. FFmpeg入门,简单播放器

    一个偶然的机缘,好像要做直播相关的项目 为了筹备,前期做一些只是储备,于是开始学习ffmpeg 这是学习的第一课 做一个简单的播放器,播放视频画面帧 思路是,将视频文件解码,得到帧,然后使用定时器,1 ...

  7. JavaCV 学习(二):使用 JavaCV + FFmpeg 制作拉流播放器

    一.前言 在 Android 音视频开发学习思路 中,我们不断的学习和了解音视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来.这样才能得到更深层次的领悟.通过整理 ...

  8. ffmpeg学习(三)——ffmpeg+SDL2 实现简单播放器

    本篇实现基于ffmpeg动态库用测试程序播放本地文件和RTSP视频流. 参考文章:http://blog.csdn.net/leixiaohua1020/article/details/8652605 ...

  9. 基于FFmpeg和Qt的播放器 QtAV库

    http://blog.csdn.net/ibingow/article/details/8144795

随机推荐

  1. Windows 查看端口占用进程并关闭

    当我们在运行一些软件需要特定软件(如tomcat)时,有可能会碰上端口被占用的情况,这时候我们可能就需要更改端口或把占用端口的进程结束掉,因为更换端口可能会导致当前环境产生一些的问题或是需要重新配置其 ...

  2. Myeclipse中JSP镶嵌的html报错

    Window > perferences > General > Editors > File Associations > 在File types 中选择 *.jsp ...

  3. Android源码分析(五)-----如何从架构师的角度去设计Framework框架

    一 : 架构与程序 软件架构是一种思维方式,而程序只是实现思维方式的一种手段,代码固然重要,但是若没有整体的思维架构,一切程序都如水中浮萍. 二 : 框架如何设计 暂时抛开Android Framew ...

  4. Java并发面试问题之volatile到底是什么?

    本文转载自公众号:石杉的架构笔记,阅读大约需要7分钟. 一.写在前面 前段时间把几年前带过的一个项目架构演进的过程整理了一个系列出来,参见(<亿级流量架构系列专栏总结>). 不过很多同学看 ...

  5. JVM 源码解读之 CMS 何时会进行 Full GC

    t点击上方"涤生的博客",关注我 转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注. 前言 本文内容是基于 JDK 8 在文章 JVM 源码解读之 CMS GC 触 ...

  6. 一、MySQL基础知识

    一.背景介绍 我们每天都在访问各种网站.APP,如微信.QQ.抖音,今日头条等,这些东西上面都存在大量的信息,这些信息都需要有地方存储,存储在哪里呢?数据库. 所有我们需要开发一个网站.APP,数据库 ...

  7. Docker10-实战-构建Java Web运行环境

    目录 创建Docker镜像 下载制作镜像的系统 启动容器并修改镜像 制作镜像 创建Docker镜像 [info]构建Docker镜像的一般过程是首先创建一个容器, 并在容器里修改镜像,配置相关环境等, ...

  8. backtrace() returns only one stack frame

    参考: 在Linux中如何利用backtrace信息解决程序崩溃的问题 linux 打印堆栈方法 https://devtalk.nvidia.com/default/topic/987279/jet ...

  9. ELK快速入门(二)通过logstash收集日志

    ELK快速入门二-通过logstash收集日志 说明 这里的环境接着上面的ELK快速入门-基本部署文章继续下面的操作. 收集多个日志文件 1)logstash配置文件编写 [root@linux-el ...

  10. 纯数据结构Java实现(10/11)(2-3树&红黑树)

    欢迎访问我的自建博客: CH-YK Blog.