<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>视频处理 on KnightLi的博客</title>
        <link>https://knightli.com/tags/%E8%A7%86%E9%A2%91%E5%A4%84%E7%90%86/</link>
        <description>Recent content in 视频处理 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Thu, 02 Apr 2026 23:14:03 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/%E8%A7%86%E9%A2%91%E5%A4%84%E7%90%86/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>FFmpeg 的 `-map` 参数详解：精准选择视频、音频与字幕流</title>
        <link>https://knightli.com/2026/04/02/ffmpeg-map-parameter-guide/</link>
        <pubDate>Thu, 02 Apr 2026 23:14:03 +0800</pubDate>
        
        <guid>https://knightli.com/2026/04/02/ffmpeg-map-parameter-guide/</guid>
        <description>&lt;p&gt;在多音轨、多字幕的视频处理中，&lt;code&gt;-map&lt;/code&gt; 是 FFmpeg 最关键也最容易用错的参数之一。&lt;/p&gt;
&lt;p&gt;如果你不显式指定 &lt;code&gt;-map&lt;/code&gt;，FFmpeg 会按默认规则自动挑选流，结果常常不是你想要的。比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;导出后丢了字幕&lt;/li&gt;
&lt;li&gt;选错了音轨语言&lt;/li&gt;
&lt;li&gt;混入了不需要的数据流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这篇文章用最常见的场景，讲清楚 &lt;code&gt;-map&lt;/code&gt; 怎么用。&lt;/p&gt;
&lt;h2 id=&#34;先理解什么是流&#34;&gt;先理解什么是“流”
&lt;/h2&gt;&lt;p&gt;一个容器文件（例如 &lt;code&gt;mp4&lt;/code&gt;、&lt;code&gt;mkv&lt;/code&gt;）里通常不止一个内容流（stream），常见包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;视频流（&lt;code&gt;v&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;音频流（&lt;code&gt;a&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;字幕流（&lt;code&gt;s&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;附件/数据流（如字体、封面、章节等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你可以先用 &lt;code&gt;ffprobe&lt;/code&gt; 看清文件里有什么流：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffprobe -hide_banner input.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;-map-的基本语法&#34;&gt;&lt;code&gt;-map&lt;/code&gt; 的基本语法
&lt;/h2&gt;&lt;p&gt;最常见写法：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-map input_index[:stream_type][:stream_index]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0:v&lt;/code&gt;：第 1 个输入文件的所有视频流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0:a:0&lt;/code&gt;：第 1 个输入文件的第 1 条音频流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1:s:1&lt;/code&gt;：第 2 个输入文件的第 2 条字幕流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_index&lt;/code&gt; 从 &lt;code&gt;0&lt;/code&gt; 开始，对应 &lt;code&gt;-i&lt;/code&gt; 的顺序&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream_index&lt;/code&gt; 也从 &lt;code&gt;0&lt;/code&gt; 开始&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;实战示例&#34;&gt;实战示例
&lt;/h2&gt;&lt;h3 id=&#34;1-视频来自-a音频来自-b&#34;&gt;1) 视频来自 A，音频来自 B
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i english.mp4 -i french.mp3 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -map 0:v:0 -map 1:a:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c:v copy -c:a aac &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  french.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取 &lt;code&gt;english.mp4&lt;/code&gt; 的第 1 条视频流&lt;/li&gt;
&lt;li&gt;取 &lt;code&gt;french.mp3&lt;/code&gt; 的第 1 条音频流&lt;/li&gt;
&lt;li&gt;合并输出为 &lt;code&gt;french.mp4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-保留第一个输入的全部流再额外加一条音轨&#34;&gt;2) 保留第一个输入的全部流，再额外加一条音轨
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i english.mp4 -i french.mp3 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -map &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -map 1:a:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c copy &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  english-french.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-map 0&lt;/code&gt; 先把第一个输入文件中的所有流都带上&lt;/li&gt;
&lt;li&gt;再追加第二个输入的第 1 条音频流&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;两个很实用的进阶技巧&#34;&gt;两个很实用的进阶技巧
&lt;/h2&gt;&lt;h3 id=&#34;1-负映射排除不想要的流&#34;&gt;1) 负映射：排除不想要的流
&lt;/h3&gt;&lt;p&gt;例如保留第一个输入的全部流，但去掉第 2 条音频流：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mkv -map &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -map -0:a:1 -c copy output.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-可选映射流不存在也不中断&#34;&gt;2) 可选映射：流不存在也不中断
&lt;/h3&gt;&lt;p&gt;某些文件可能没有字幕，这时可以用 &lt;code&gt;?&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mp4 -map 0:v -map 0:a -map 0:s? -c copy output.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;0:s?&lt;/code&gt; 表示“有字幕就映射，没有就跳过，不报错”。&lt;/p&gt;
&lt;h2 id=&#34;常见坑位&#34;&gt;常见坑位
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;-map&lt;/code&gt; 一旦使用，FFmpeg 就不再按默认自动选流，必须把你要的都写出来。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c copy&lt;/code&gt; 只是封装复制，不做转码；若目标容器不支持某编码，仍会失败。&lt;/li&gt;
&lt;li&gt;多输入时最容易错的是输入序号，记住序号只看 &lt;code&gt;-i&lt;/code&gt; 的先后顺序。&lt;/li&gt;
&lt;li&gt;想做稳定脚本时，先 &lt;code&gt;ffprobe&lt;/code&gt; 再生成 &lt;code&gt;-map&lt;/code&gt;，比手写更稳。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;-map&lt;/code&gt; 的核心就是一句话：明确告诉 FFmpeg，“从哪个输入，拿哪类流，拿第几条”。&lt;/p&gt;
&lt;p&gt;掌握它之后，你就能稳定处理多音轨、多字幕、跨文件拼接等复杂场景，避免“导出结果不对但又不知道为什么”的问题。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
