更改

跳到导航 跳到搜索
完成一部分“手动分配媒体流”
就会把 “听爸爸的话” 第 01 到 04 话从 MKV 转到 MP4 封装格式。不过因为这东西不属于 FFmpeg 的范畴,所以我在这里不打算详细说明,按照上面的例子生搬硬套也应该能满足大部分需求。
 
== 手动分配媒体流 ==
 
有时候我们要面对复杂的媒体流分配,比如我有两个视频文件, <code>a.mp4</code> 和 <code>b.mp4</code> ,我想将 <code>a.mp4</code> 的视频流和 <code>b.mp4</code> 的音频流提取出来,做成一个新的新视频文件,要怎么做呢?
 
我可以先用 <code>ffmpeg -i a.mp4 -c:v copy -an a_video.mp4</code> 将 <code>a.mp4</code> 的视频流单独提取到一个文件上,叫 <code>a_video.mp4</code> 。<br />
然后用 <code>ffmpeg -i b.mp4 -c:a copy -vn b_audio.aac</code> 将 <code>b.mp4</code> 的音频流单独提取到 <code>b_audio.aac</code> 上。<br />
最后用 <code>ffmpeg -i a_video.mp4 -i b_audio.aac -c copy final.mp4</code> 将 <code>a_video.mp4</code> 和 <code>b_audio.aac</code> 放到一起得到最后的成果 <code>final.mp4</code> 。
 
可是这样需要 3 个步骤,还会产生临时文件。实际上,我们还可以使用手动分配媒体流的方式,用一条命令完成。
 
这时就要用到 <code>-map</code> 选项了,一旦你使用了这个选项, FFmpeg 就不会自动为你将输入文件的媒体流分配到输出文件上,相对的,你可以手动分配。 <code>-map</code> 选项的参数是 <code>输入文件编号:这个文件的媒体流编号</code> ,指定一次即代表这个媒体流会被分配到输出文件中,比如 <code>-map 0:0</code> 将会指定 0 号输入文件的 0 号媒体流(注意编号是以 0 开始计数!)。
 
<code>-map</code> 选项可以指定多次,从而依次指定输出的媒体流顺序,也就是说,第一次 <code>-map</code> 指定的媒体流将会变成输出文件的 0 号媒体流,第二次 <code>-map</code> 就会指定输出文件的 1 号媒体流,以此类推。举个例子,如果写了 <code>-map 0:0 -map 0:1</code> ,那么 0 号输入文件的 0 号媒体流就会变成输出文件的 0 号媒体流, 0 号输入文件的 1 号媒体流就会变成输出文件的 1 号媒体流。画一幅图来帮助理解:

导航菜单