我无法让ffmpeg从.mp4文件中复制所有音频流。在线搜索数小时后,似乎应该复制所有流(as shown in example 4 here):
ffmpeg -i in.mp4 -map 0 -c copy out.mp4
in.mp4
包含3个流:
out.mp4
(应与in.mp4
相同)仅包含2个流:
FFmpeg确实可以正确识别所有3个流,但不会复制所有这些流。 FFmpeg的输出:
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (copy)
修改: ffmpeg -v 9 -loglevel 99 -i in.mp4
的输出:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from in.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.36.100
Duration: 00:00:06.03, start: 0.000000, bitrate: 5582 kb/s
Stream #0:0(und), 1, 1/15360: Video: h264 (Main), 1 reference frame (avc1 /
0x31637661), yuv420p(tv, bt470bg/unknown/unknown, left), 1920x1080 (0x0) [SAR 1:
1 DAR 16:9], 0/1, 5317 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream #0:2(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
stereo, fltp, 128 kb/s
Metadata:
handler_name : SoundHandler
Successfully opened the file.
At least one output file must be specified
[AVIOContext @ 0000000001c2b9e0] Statistics: 153350 bytes read, 2 seeks
编辑2(已解决):我设法从this ticket找到了正确的语法。对于任何感兴趣的人,正确的语法是:
ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0 out.mp4
这将复制所有流。
答案 0 :(得分:11)
显然这是一个很受欢迎的问题,所以我将我的解决方案作为答案发布(以前是评论回复),以便其他人可以看到。
我设法从这个ticket找到了正确的语法。正确的语法是:
ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0:0 -map 0:1 -map 0:2 out.mp4
这将复制所有3个流。
答案 1 :(得分:10)
FFmpeg具有将所有流映射到输出的选项,必须使用选项-map 0
将所有流从输入映射到输出。
全行显示如下:
ffmpeg -i in.mp4 -c copy -map 0 out.mp4
有关更多信息,请参见stream selection和-map
选项的文档。
答案 2 :(得分:0)
好的,我深入阅读了package x;
import java.util.Arrays;
public class x {
public static void main(String[] args) {
int[] myArray = {2, 4, 1, 6, 8, 5, 3, 7};
mergeSort(myArray);
System.out.println((Arrays.toString(myArray)));
}
public static void mergeSort(int []toSortArray){
int n= toSortArray.length;
if (n < 2) {
return;
}
int mid = n/2;
int []Left = new int [mid];
int []Right = new int[n-mid];
for(int i=0;i<mid;i++){
Left[i]=toSortArray[i];
}
for(int i=mid;i<n;i++){
Right[i-mid]=toSortArray[i];
}
mergeSort(Left);
mergeSort(Right);
merge(Left,Right,toSortArray);
}
public static void merge(int[] Left, int [] Right, int []SortedArray){
int nL = Left.length;
int nR= Right.length;
int i=0;// index position for Left array
int j=0;// index position for Right array
int k=0;// index position for Sorted array
while (i<nL && j<nR){
if (Left[i]<=Right[j]) {
SortedArray[k] = Left[i];
i++;
k++;
} else {
SortedArray[k] = Right[j];
j++;
k++;
}
}
while(i<nL){
SortedArray[k]=Left[i];
i++;
k++;
} while (j<nR){
SortedArray[k]= Right[j];
j++;
k++;
}
}
}
手册页,发现这应该是有用的:
请注意,目前每个输出流只能包含来自的通道 单个输入流;你不能例如使用“-map_channel”来 选择不同流中包含的多个输入音频通道 (来自相同或不同的文件)并将它们合并为单个输出 流。因此,例如,目前不可能转向 两个单独的单声道流成为单个立体声流。然而 将立体声流分成两个单声道单声道流是 可能的。
如果您需要此功能,可能的解决方法是使用amerge 过滤。例如,如果您需要合并媒体(此处为input.mkv) 将2个单声道音频流合并为一个立体声声道音频流 (并保留视频流),您可以使用以下命令:
ffmpeg
您可能需要仔细阅读并试用ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
上的手册页说明,以了解您为命名渠道和预期输出所涉及的复杂程度。
[编辑:正如Mulvya所说,这回答了一个问题,但这不是原始海报的问题。]
答案 3 :(得分:0)
首先,我在这里尝试了更广泛的答案:https://stackoverflow.com/a/54616353/1422630
但是我遇到了字幕轨道不受支持的麻烦,所以我不得不使用以下命令:
avconv -i INFILE -c copy -map 0:a -map 0:v OUTFILE
我了解到,在我请求复制后,它基本上只复制了我映射的内容(当然它也映射了所有音频),因为我根本不关心字幕的嵌入性。 。如果要映射字幕,只需添加此-map 0:s
。