ffmpeg命令行map参数的使用

2023-11-10

介绍

理解-map参数的最好办法就是想像一下怎么去告诉ffmpeg你要从源文件中选择/拷贝哪个流到输出文件。输出文件的stream顺序取决于在命令行中-map的参数顺序。

下面有一些例子。

默认

默认操作(没有指定map参数),比如:

ffmpeg -i INPUT OUTPUT

本质上,是从所有输入中发现“最高质量”(单个)视频输入流和“最高质量”(单个)音频输入流,并“发送”到OUTPUT。所有其他输入流实质上都被丢弃了。

如果我们想用map命令“显示”与上面命令相同的操作,它会是这样的:

ffmpeg -i INPUT -map single_highest_quality_video_stream_from_all_inputs -map single_highest_quality_audio_stream_from_all_inputs OUTPUT

此处输出将有两个流,一个音频,一个视频。

当你想要控制哪些流被包含,或者在输出中包含不止一个流时,你需要/想要手动指定“-map”命令,并修改这些参数。

输入文件

在下面的所有示例中,我们将使用一个类似下面的示例输入文件:

# fmpeg -i input.mkv

ffmpeg version ... Copyright (c) 2000-2012 the FFmpeg developers
...
Input #0, matroska,webm, from 'input.mkv':
  Duration: 01:39:44.02, start: 0.000000, bitrate: 5793 kb/s
    Stream #0:0(eng): Video: h264 (High), yuv420p, 1920x800, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Stream #0:1(ger): Audio: dts (DTS), 48000 Hz, 5.1(side), s16, 1536 kb/s (default)
    Stream #0:2(eng): Audio: dts (DTS), 48000 Hz, 5.1(side), s16, 1536 kb/s
    Stream #0:3(ger): Subtitle: text (default)
At least one output file must be specified

#

例子1

那么现在,我们说我们想要:

  • 将视频流复制
  • 将德语音频流编码为MP3(128kbps)和AAC(96kbps)(在输出中创建两个音频流)
  • 将英语音频流删除
  • 将字幕流复制

这可以用以下的ffmpeg命令来完成:

ffmpeg -i input.mkv \
    -map 0:0 -map 0:1 -map 0:1 -map 0:3 \
    -c:v copy \
    -c:a:0 libmp3lame -b:a:0 128k \
    -c:a:1 libfaac -b:a:1 96k \
    -c:s copy \
    output.mkv

注意一下参数里没有“-map 0:2”,并且“-map 0:1”被写了两次。

使用“-map 0:0 -map 0:1 -map 0:1 -map 0:3”,我们告诉ffmpeg选择/映射指定的输入流按相应顺序输出。

因此,我们的输出将具有以下流:

Output #0, matroska, to 'output.mkv':
    Stream #0:0(eng): Video ...
    Stream #0:1(ger): Audio ...
    Stream #0:2(ger): Audio ...
    Stream #0:3(ger): Subtitle ...

在我们选择好在输出中包含哪些流之后,使用“-map”选项,我们为输出中的每个流指定相应的编解码器。

视频和字幕流已经被复制,德语的音频流被编码成了两个新的音频流,MP3和AAC。

我们使用“-c:a:0”来指定输出的第一路音频流编解码器(codec),且用“-c:a:1”来指定输出的第二路音频流编解码器(codec)。

注意,“a:0”指的是输出的第一路音频流(本例中为0:1),“a:1”指的是输出的第二路音频流(也映射到输入流0:1),等。

结果将会是:

Output #0, matroska, to 'output.mkv':
    Stream #0:0(eng): Video ...
    Stream #0:1(ger): Audio ...
    Stream #0:2(ger): Audio ...
    Stream #0:3(ger): Subtitle ...
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (dca -> libmp3lame)
  Stream #0:2 -> #0:2 (dca -> libfaac)
  Stream #0:3 -> #0:3 (copy)

例子2

如果说我们想要倒序排列输入流,比如类似这样的输出:

    Stream #0:0(ger): Subtitle: text (default)
    Stream #0:1(eng): Audio: dts (DTS), 48000 Hz, 5.1(side), s16, 1536 kb/s
    Stream #0:2(ger): Audio: dts (DTS), 48000 Hz, 5.1(side), s16, 1536 kb/s (default)
    Stream #0:3(eng): Video: h264 (High), yuv420p, 1920x800, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)

这可以简单地使用下面的命令行来完成:

ffmpeg -i input.mkv -map 0:3 -map 0:2 -map 0:1 -map 0:0 -c copy output.mkv

注意,我们指定了所有的输入流,输出中的流顺序也会按照输入流的顺序生成。

选项“-c copy”告诉ffmpeg在所有流上使用“复制”操作。

例子3

如果我们想从同一个输入文件中仅提取音频流,那么我们可以这样做:

ffmpeg -i input.mkv -map 0:1 -map 0:2 -c copy output.mkv

例子4

如果我们想重新编码视频流,但复制所有其他流(如音频、字幕、附件等),我们可能会使用这样的东西:

ffmpeg -i input.mkv -map 0 -c copy -c:v mpeg2video output.mkv

这将会告诉ffmpeg:

  • 读取输入文件“'input.mkv'”
  • 选择要处理的所有输入流(第一个input=0)(使用“-map 0”)
  • 标记所有流被复制到输出(使用“-c copy”)
  • 标记要重新编码的视频流(使用“-c:v mpeg2video”)
  • 写入输出文件到“output.mkv”

例子5

你可以使用"-map"命令来创建多路文件输出,比如:

ffmpeg -i input.mkv -map 0:1 -map 0:2 audios_only.mkv -map 0:0 video_only.mkv

默认是将“最高质量视频”和“最高质量音频”映射到每个输出文件(基本上为每个输出重复使用),更多请参考创建多个输出

例子6

你可以使用一个滤镜(filtergraph)做为map参数来控制输出:

ffmpeg -i INPUT -filter_complex "[0] scale=100x100[smaller_sized]"  -map "[smaller_sized]" out.mp4

这(在我们的示例中)与更精确地指定流是相同的,并且完全一样。

ffmpeg -i INPUT -filter_complex "[0:0] scale=100x100[smaller_sized]"  -map "[smaller_sized]" out.mp4

例子7

还有一些流选择快捷方式,比如你也可以使用“0:v”:

ffmpeg -i input -map 0:v -map 0:a output.mkv # chooses video and audio from input 0

具体请参见流指示器

例子8

MPEG流的选择:

最棘手的部分是从MPEG TS流选择时它可能会有多个流/通道,如果你正在接收“实时数据”(live data),仅仅指定索引可能是不行的,因为索引可以在运行时有所变化,所以:

ffmpeg -i INPUT -map 0:6 OUTPUT # 每次运行产生的结果可能都不一样,请不要这样使用!

假设您的文件是MPEG,您可以运行“ffmpeg -i INPUT”(不指定输出)来查看它包含的程序ID和流ID,比如这个示例(对其进行分析,以帮助“确保”它接收到其中的所有流,可能并不总是需要的)。

$ ffmpeg -probesize 50M -analyzeduration 50M -i INPUT
...
Input #0, mpegts, from 'INPUT':
  Duration: N/A, start: 22159.226833, bitrate: N/A
  Program 1344
    Metadata:
      service_name    : 7 Digital
      service_provider: Seven Network
    Stream #0:0[0x401]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 720x576 [SAR 64:45 DAR 16:9], max. 14950 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x402](eng): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 256 kb/s
  Program 1346
    Metadata:
      service_name    : 7TWO
      service_provider: Seven Network
    Stream #0:3[0x406]: Unknown: none ([5][0][0][0] / 0x0005)
    Stream #0:6[0x421]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 720x576 [SAR 64:45 DAR 16:9], max. 14950 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:7[0x422](eng): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 192 kb/s
    Stream #0:8[0x424](eng): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006), 492x250
    Stream #0:4[0x499]: Unknown: none ([11][0][0][0] / 0x000B)

你可以通过程序ID指定所需的流:

ffmpeg -i INPUT -map 0:p:1344 OUTPUT # 从程序1344中输入两个输入,在本例子中是通道“7 digital”

或指定子流:

ffmpeg -i INPUT -map i:0x401 OUTPUT # 从找到的任何地方用PID(MPEG Packet ID [stream identifier])0x401拉入单个输入流,在本例中,它是“7 digital”中的视频流

其他类似的,请参阅其说明符示例。注意,如果你有“未知”的流在那里,你可能需要添加-ignore_unknown标志。

还请注意,如果输入流包含多个程序ID,则可以使用相同的ffmpeg实例和这里描述的map命令同时来记录它们。

例子9

包括“全部”输入到输出。默认行为是只复制一个音频和一个视频通道。如果你想复制“所有”频道,请使用“-map”:

ffmpeg -i input -map 0 output.mp4 # 从一个输入重新编码所有视频和音频通道 
ffmpeg -i input -map 0 -c copy output.mp4 # 将所有视频和音频通道从一个输入复制到输出,而不是仅一个视频

英文原文地址:http://trac.ffmpeg.org/wiki/Map

若有翻译不准确的地方,欢迎留言指出,我会尽快改正。

转载请注明出处:https://blog.csdn.net/xiaoluer/article/details/81136478

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ffmpeg命令行map参数的使用 的相关文章

随机推荐

  • redis配置哨兵(sentinel)模式

    主从复制 当主服务器宕机时 我们需要手动的将从服务器中选取新的主服务器 这样会会需要人工干预 费时费力 而且不能及时的发现服务器宕机 造成一定时间内服务不可用 这并不是一个推荐的方案 我们更加建议使用哨兵模式替代 哨兵模式 Redis Se
  • 微信小程序wx.getLocation接口审核不通过

    审核不通过的原因一般包含这几种 一 当前提审小程序代码包中地理位置相关接口 wx getLocation 暂未开通 分析原因 接口未开通 解决方法 按下图申请开通对应的接口即可 二 你所描述的小程序接口使用场景 目前未符合接入wx getL
  • taro 兼容支付宝小程序和微信小程序<六>-- 自定义密码或验证码输入框组件的input 自动获取焦点(ios支付宝小程序怎么隐藏input的光标)

    项目 tar3 vue3 问题 自定义密码或验证码输入框需要自动聚焦 拉起键盘 A 微信小程序 用了自定义指令达到这个目的 自定义密码或验证码输入框 input自动获取焦点之坑 B 支付宝小程序 官方文档中说不支持自动获取焦点 必须手动拉起
  • 解决mysql经常断开重连的问题

    解决mysql自动断开连接的问题 有三个方法可以解决这个问题 1 修改MySQL配置参数 2 修改JDBC 3 修改第三方的数据库连接池应用 Proxool xml 方法1的解决方案 这个参数的名称是 wait timeout 其默认值为
  • redis 获取 list 中的所有元素

    一种方法是用 lrange key 0 1 这种方法不会影响 redis list 中的数据 List
  • QT 网络编程之https

    HTTP 超文本传输协议 是一个基于请求与响应 无状态的 应用层的协议 常基于TCP IP协议传输数据 互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法 H
  • 【Python-3.5】matplotlib做简单折线图

    在matplotlib中使用plot 函数可以做出简单折线图 预期效果如下 代码如下 导入pyplot模块 import matplotlib pyplot as plt 输入横纵坐标数据 months 1 2 3 4 5 6 people
  • 分布式事务解决方案

    一 概述 分布式事务 分布式系统会把一个应用拆分为多个可独立部署的服务 此时要完成事务 就需要这些服务之间远程交互完成事务 简单的说跨JVM进程或者跨数据库实例产生分布式事务 典型的分布式事务场景 跨库事务 一个应用中某个功能需要操作多个库
  • Android基础-Service和IntentService知识点详细总结

    Service 对于广大的Android开发者来说算是耳熟能详了 作为Android的四大组件之一 在我们的开发中也起着重要的作用 在Android面试中 Service相关的问题也是面试官问得比较多的 当别人问你 Service 到底是什
  • 【torch.nn.init】初始化参数方法解读

    可参考 torch nn init 云 社区 腾讯云 一 torch nn init constant tensor val 1 作用 常数分布 用值val填充向量 2 参数 tensor an n dimensional torch Te
  • 青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

    4月18日 青藤以 云时代 安全变了 为主题的2023年云安全高峰论坛在北京成功举办 会上 青藤首次提出 业安融合 理念 正式发布先进云安全方案CNAPP 中国全面进入云和数字化时代 当前 全球已进入数字经济时代 我国高度重视数字经济发展
  • Postgresql on conflict do update 设置当前值,原始值,当前值与原始值相加值

    Postgresql插入时主键冲突会报错 可采取冲突不做任何处理或者进行更新 俩种方式避免报错 更新时可以保存新值 保存新值与旧值表达式 更新时可以保存原来的值 ON CONFLICT date city DO NOTHING 或者 ON
  • JVM —堆内存区域的认识

    一个JVM只有一个堆 堆的大小是可以调节的 堆中存放的内容 当类加载器读取完类文件后 会把类 方法 常量 变量等存放在堆中 保存的是我们所有引用对象的真实对象 也就是真实引用对象的数据等 堆内存中的三个区域 新生区 老年区 永久区 堆中要进
  • 【Typescript】ts中的静态属性和静态方法

    Typescript中的静态属性和静态方法 在ts中使用静态属性和方法 需要有static关键字 且在静态方法里只能用静态属性 举两个栗子 在es5中 function Person this run1 function 实例方法 实例化后
  • 特征缩放(归一化处理)

    在我们面对多维特征问题的时候 我们要保证这些特征都具有相近的尺度 这将帮助梯度下降算法更快地收敛 以房价问题为例 假设我们使用两个特征 房屋的尺寸和房间的数量 尺寸的值为 0 2000平方英尺 而房间数量的值则是0 5 以两个参数分别为横纵
  • 带有 OpenCV.js 的 ESP32-CAM Web 服务器:颜色识别和跟踪

    本教程介绍了使用 ESP32 摄像头网络服务器环境的 OpenCV js 和 OpenCV 工具 例如 我们将构建一个简单的 ESP32 摄像头网络服务器 其中包括对移动物体的颜色检测和跟踪 本教程绝不是对 OpenCV 可以提供给 ESP
  • 学乐高机器人还是学习少儿编程

    学乐高机器人还是学习少儿编程 对于很多的家长来说 孩子的学习一直都是他们非常关心和重视的一件事情 很多的家长在给孩子选择学习课程的时候 也是非常的耐心的 他们会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编
  • 生成树协议实验报告_“网络工程师培训”基础教程:OSPF协议及配置

    OSPF协议概述 OSPF 是 Open Shortest Path First 即 开放最短路由优先协议 的缩写 它是 IETF 组织开发的一个基于链路状态的自治系统内部路由协议 在IP 网络上 它通过收集和传递自治系统的链路状态来动态地
  • 牛客网Verilog刷题——VL54

    牛客网Verilog刷题 VL54 题目 答案 题目 实现一个深度为8 位宽为4bit的双端口RAM 数据全部初始化为0000 具有两组端口 分别用于读数据和写数据 读写操作可以同时进行 当读数据指示信号read en有效时 通过读地址信号
  • ffmpeg命令行map参数的使用

    介绍 理解 map参数的最好办法就是想像一下怎么去告诉ffmpeg你要从源文件中选择 拷贝哪个流到输出文件 输出文件的stream顺序取决于在命令行中 map的参数顺序 下面有一些例子 默认 默认操作 没有指定map参数 比如 ffmpeg