热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:流的操作如何选择流?

篇首语:本文由编程笔记#小编为大家整理,主要介绍了流的操作如何选择流?相关的知识,希望对你有一定的参考价值。 转发自白狼栈:查看原文从流的操作(一)视频转音频引发的血案一文中我们了解到,流的选择,实际

篇首语:本文由编程笔记#小编为大家整理,主要介绍了流的操作如何选择流?相关的知识,希望对你有一定的参考价值。


转发自白狼栈:查看原文

从流的操作(一)视频转音频引发的血案一文中我们了解到,流的选择,实际有两种方式,一种是ffmpeg自动选择,一种是设置参数手动选择。

对于自动选择,ffmpeg默认选择规则如下:

  1. 视频流:默认选择分辨率最高的流
  2. 音频流:默认选择通道最多的流
  3. 字幕流:默认选择第一个字幕编码器支持的字幕流

对于视频流和音频流,如果分辨率相等或者通道相等则以第一个为准,数据流和附件流不支持自动选择,需要手动选择。

自动选择的情况下,ffmpeg每种类型只会选择一路,举个例子

ffmpeg -i r3.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from \'r3.mp4\':
...
Duration: 00:00:58.54, start: 0.000000, bitrate: 1998 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
Stream #0:2(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

注:Stream #0:0,第一个0表示第一个输入文件,第二个0表示第一个输入文件的第一路流

如果我们直接对 r3.mp4 转码操作,你会发现输出的视频只保留了一路视频和一路音频。

1、ffmpeg -i r3.mp4 tmp-r3.mp4
2、ffmpeg -i tmp-r3.mp4
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1684 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)

这就是ffmpeg自动选择的结果。

如果想要输入视频的Stream #0:2这路音频流,就只能手动指定了。

流的手动模式,使用 -map 参数操作,-map 非常重要,后面我们还会反复使用它。它表示我们需要从输入文件中选择哪些流到输出文件。

语法规则:

-map [-]input_file_index[:stream_type_specifier][:stream_index]

  1. 中括号[]表示可选,input_file_index 之前的 - 表示反选,即可以剔除某一路流。
  2. input_file_index 指的是某个输入文件,我们可以用下标0表示第一个输入文件,1表示第二个输入文件,以此类推;
  3. stream_type_specifier (可选)指的是指定输入文件的某路流的类型,我们用 a、v、s、d、t分别表示音频流、视频流、字幕流、数据流和附件流;
  4. stream_index(可选)指的是具体的某个类型的某路流。

我们仍然以案例一的素材视频为例(没有下载的可以点击这里下载。

如果我们以r1ori.mp4为输入,想得到r3.mp4的结果,即多了一路音频流且是mp3格式的,怎么做?

ffmpeg -i r1ori.mp4 -map 0:v -map 0:a:0 -map 0:a:0 -c:v copy -c:a:0 copy -c:a:1 libmp3lame -y r3.mp4

注意输出代码段Stream mapping这一段

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:1 -> #0:2 (aac (native) -> mp3 (libmp3lame))

简单分析下

  1. 因为只有一个输入文件,所以-map的第一个参数都是0
  2. -map 0:v 表示选择输入文件的所有视频流(这里视频流只有一个)到输出,-c:v copy表示复制所有的视频流,即你看到的 Stream #0:0 -> #0:0 (copy)
  3. -map 00 我们写了两遍,第一个表示选择输入文件的第一个音频流到输出,第二个仍然表示选择输入文件的第一个音频流到输出,相当于输出了两路音频流
  4. -map 0:v -map 00 -map 00 连起来也有关系,表示要按照我们选择的这三路顺序输出
  5. -c0 copy 针对第一个音频流进行复制,不重新编码,即 Stream #0:1 -> #0:1 (copy); -c1 libmp3lame 针对第二个音频流使用libmp3lame编码器重新编码,即输出过程中的 Stream #0:1 -> #0:2 (aac (native) -> mp3 (libmp3lame))

后面我们还会大量使用-map命令,所以上面这段分析,务必要理解清楚。

上面的命令同样等价于

ffmpeg -i r1ori.mp4 -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 copy -c:a:1 libmp3lame -y r3.mp4

-map 0:v 这里等价于 -map 0:0,-map 00 等价于-map 0:1,这是因为在r1ori.mp4中#0:0就是视频流,#0:1就是音频流

ffmpeg -i r1ori.mp4
...
Stream #0:0(und): Video: h264
Stream #0:1(und): Audio
...

注意:-map的参数,针对的是输入流,因为是我们想要从输入流中选择流到输出;-c选项的参数,针对的并不再是输入流了,-c的参数针对的是-map选择的流,即输出流。

除此之外,下面我们再看几个简单的例子,你可以在看结果之前尝试下

1、复制输入文件的所有流到输出,输出结果可就不止只有两路流了

ffmpeg -i r3.mp4 -map 0 -c copy output.mp4

2、把输入文件的三路流分别拆开,输出三个文件

ffmpeg -y -i r3.mp4 -map 0:v -c:v copy output-silent.mp4 \\
-map 0:a:0 -c:a copy output-audio.aac \\
-map 0:a:1 -c:a copy output-audio.mp3

我们还可以设置一些选项,比如可以设置r3.mp4的两路音频流有不同的码率。

ffmpeg -i r3.mp4 -b:a:0 32k -b:a:1 64k -map 0 -y r4.mp4

-map 0 是必须的,不然输出结果并不会输出两路音频流。

对于音视频流还有很多选项设置,具体你可以查阅官方文档了解,你也可以在我们平时练习中多查阅资料,奠定基础。

最后,我们还有一种最最常见的操作——结合滤镜使用。

比如把原视频 r3.mp4 等比例缩放一倍

ffmpeg -i r3.mp4 -vf scale=272:480 -y filter.mp4

我们也可以手动选择流处理

ffmpeg -i r3.mp4 -filter_complex "[0]scale=272:480[out]" -map 0:a -map "[out]" -y filter.mp4

上面这两条命令你可能很难理解,关于滤镜,大家先有个印象,下面文章我们再作详细介绍。

流的操作我们就介绍到这里,大家在练习中碰到各种莫名其妙的问题,尽管留言。


推荐阅读
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
author-avatar
休息一下狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有