距离上一次教程又过去了将近一个多月,相信大家已经都将我上节课所说的东西所完全消化掉了。

这节课就来点轻松的,说说libav的命令使用吧。

注:遇到不懂的或者本文没有提到的可以用例如命令后加 --help full或者man 命令(man avconv)查看全部参数细节,或者进libav.org网站查:https://libav.org/avconv.html

杀手级命令:avconv:

个人认为他最强大的功能就是对各种格式的支持范围非常广,你拥有了它可以完全丢弃例如在Windows上格式工厂之类的软件,它支持你所有市面上流行的媒体格式文件。

最简单的转换格式的命令示例(将src.avi文件按照原视频比例转换成MP4格式放置到dst.mp4): avconv -i src.avi dst.mp4

如果你是想将视频中的每一帧输出成图片序列保存到磁盘上,请输入:avconv -i src.avi dst_%d.jpg

反过来如果你有按照一定规律命名好的图片序列(类似像src_0.jpg,src_1.jpg,src_2.jpg...),也可以反过来输入导出成最终视频:avconv -i src_%d.jpg dst_mp4

除了文件中的视频、图片序列可以用来作参数以外,还可以将rtsp网络视频作为参数:avconv -i rtsp://hostname[:port]/path dst.mp4

如果你想要将视频缩小一下尺寸示例(将视频转换成dst.mp4并且重置分辨率为:320x240),长宽像素数字必须同时为偶数并且大于100,,还可以填入720p、1080p之类的字符:avconv -i src.avi -s 320x240 dst.mp4

如果你想只要将原视频的前6秒转换出来的话,请输入:avconv -ss 00:00:00 -t 00:00:06 -i src.avi dst.mp4

想将原视频bite rate修改,请使用-r参数:avconv -i src.avi -r 2397600 dst.mp4

同理原视频中的音频同样也有sample rate修改的需求,请使用avconv -i src.avi -f -sample_rates 128000  dst.mp4

如果想将pixel formats重新定义的话,请使用-pix_fmt参数(注:必须是这个文件格式所支持的pix_fmts):avconv -i src.avi -pix_fmts AV_PIX_FMT_YUV420P dst.mp4

同理音频也需要sample_fmts重新设置的话,使用-sample_fmts参数,同样是输出文件格式所支持的format才能成功:avconv -i src.avi -sample_fmts AV_SAMPLE_FMT_FLTP dst.mp4

细心的人会发现上面的命令中修改sample rate中多包含了-f,其实-f是filter的意思,它是libav另外一个非常强大的工具,当你每次打开libav的源文件或者官网介绍中会发现有很多的和filter相关新奇的部分。

下面以一个简单的例子介绍一下它:

avconv -i src.avi -f clock dst.mp4  顺时针旋转视频90度就这么简单! more detail

libav还实现了并支持SAP(Session Announcement Protocol),

你一句命令就可以:avconv -re i src.avi sap sap://0.0.0.0, 播放就用avplay命令直接带 sap://localhost即可播放,或者用VLC player直接打开网络地址播放,强大吧?

libav还引用了另外一个强大的库——frei0r,它本身是用C写的一个视频特效处理的库,使用它只需给定一些简单少许的参数即可实现强大的效果,虽然我还没真正测试过,有兴趣的朋友可以玩玩看回复在下面。

另外它作为一个成熟的视频库,怎么能缺少对rtsp协议的支持呢?

建立rtsp服务器,使用命令avserver -f avserver.conf

其中avserver.conf 是一个文本文件,需要实现写好内容像这样:

Port
RTSPPort
BindAddress 0.0.0.0
MaxClients
MaxBandwidth
CustomLog connlogs.txt <Stream test.html>
File "fsbk.flv"
Format flv
</Stream> <Stream status.html>
Format status
</Stream>

是不是相当简单,如果你发现端口被占用了,输入sudo fuser -k 8848/tcp 和 sudo fuser -k 8840/tcp 杀掉相应的进程。然后执行avplay http://localhost:8848/test.html 视频就通过网络传过来了对吧,就这么简单是吧~

libav(ffmpeg)简明教程(2)的更多相关文章

  1. libav(ffmpeg)简明教程(1)

    突然发现又有好久没有写技术blog了,主要原因是最近时间都用来研究libav去了(因为api极类似ffmpeg,虽然出自同一份代码的另外一个分支,因项目选用libav,故下文均用libav代替),其实 ...

  2. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  3. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

  4. 2013 duilib入门简明教程 -- 部分bug 2 (14)

        上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃            如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口 ...

  5. 2013 duilib入门简明教程 -- 自绘控件 (15)

        在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...

  6. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

  7. 2013 duilib入门简明教程 -- FAQ (19)

        虽然前面的教程几乎把所有的知识点都罗列了,但是有很多问题经常在群里出现,所以这里再次整理一下.     需要注意的是,在下面的问题中,除了加上XML属性外,主窗口必须继承自WindowImpl ...

  8. Mac安装Windows 10的简明教程

    每次在Mac上安装Windows都是一件非常痛苦的事情,曾经为了装Win8把整台Mac的硬盘数据都弄丢了,最后通过龟速系统恢复模式恢复了MacOSX(50M电信光纤下载了3天才把系统下载完),相信和我 ...

  9. Docker简明教程

    Docker简明教程 [编者的话]使用Docker来写代码更高效并能有效提升自己的技能.Docker能打包你的开发环境,消除包的依赖冲突,并通过集装箱式的应用来减少开发时间和学习时间. Docker作 ...

随机推荐

  1. iOS模拟器的应用沙盒在MAC中的位置

    每个iOS应用都有自己专属的应用沙盒.分别为 应用程序包 Documents/ Library/Caches/ Library/Preferences/ tmp/ 当运行模拟时,在MAC下找到对应路径 ...

  2. BZOJ 1012【线段树】

    题意: Q L 询问数列最后 L 个数中最大的数. A n 将 n + t ( t_init = 0 ), 然后插到最后去. 思路: 感觉动态地插入,很有问题. 数组地长度会时常变化,但是可以先预处理 ...

  3. 2017-10-20 NOIP模拟赛2

    P98 a [问题描述]你是能看到第一题的 friends 呢.——hja世界上没有什么比卖的这么贵的弹丸三还令人绝望的事了,所以便有了这么一道题.定义?(?)为满足(? × ?)|?的有序正整数对( ...

  4. 树形DP 洛谷P2014 选课

    洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...

  5. spring boot war

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  6. mysql update select 从查询结果中更新数据

    UPDATE user_online_month_atu a INNER JOIN ( SELECT user_id, sum(c.online_times) as online_times, SUM ...

  7. LeetCode初级算法(动态规划+设计问题篇)

    目录 爬楼梯 买卖股票的最佳时机 最大子序和 打家劫舍 动态规划小结 Shuffle an Array 最小栈 爬楼梯 第一想法自然是递归,而且爬楼梯很明显是一个斐波拉切数列,所以就有了以下代码: c ...

  8. Leetcode初级算法(链表篇)

    删除链表的倒数第N个节点 感觉自己对于链表的知识还是了解的不够深入,所以没有想到用双指针进行操作.我的想法是这样的,首先计算整个链表的长度,然后遍历到长度减去n的节点处,执行删除操作. 自己的代码: ...

  9. 机器学习(四) SVM 支持向量机

    svr_linear = SVR('linear') #基于直线 svr_rbf = SVR('rbf') #基于半径 svr_poly = SVR('poly') #基于多项式

  10. docker 资源限制

    docker run 时使用-m指定可以使用的内存大小, 记录在cgroup配置文件中 cat /sys/fs/cgroup/memory/memory.limit_in_bytes jvm内存会超过 ...