![FFMPEG:](https://linux22.com/image/1467818/FFMPEG%EF%BC%9A.png)
我也在寻找 Linux 解决方案(另一个问题)
我有两个录制的视频文件,扩展名为.ts
。我需要删除第一个文件的某些部分,拆分第二个文件,然后将第一个文件与第二个文件的第一部分(拆分)合并。
它们都有相同的特点:
Format : MPEG-TS
File size : 3.16 GiB
Duration : 1h 39mn
Overall bit rate mode : Variable
Overall bit rate : 4 527 Kbps
Video
ID : 720 (0x2D0)
Menu ID : 6181 (0x1825)
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : 27
Duration : 1h 39mn
Width : 1 440 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate : 25.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : MBAFF
它们还包含多个音轨和字幕。
我想在不对文件进行转码的情况下处理它们,至少能够删除开头等等。
FFMPEG
:
ffmpeg -i source.mts
给出:
Input #0, mpegts, from 'source1.mts':
Duration: 01:40:00.76, start: 2995.511878, bitrate: 4526 kb/s
Program 6181
Stream #0:0[0x46](fra,fra): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
Stream #0:1[0x2d0]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:2[0x2da](fra): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 73 kb/s
Stream #0:3[0x2db](qaa): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 67 kb/s
Stream #0:4[0x2dc](deu): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 49 kb/s
Stream #0:5[0x2dd](qad): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 57 kb/s
我认为用 可以很好地实现ffmpeg
,它也是跨平台的,这是我发现的命令这里 删除一个文件的一部分。
ffmpeg -i InputFile -vcodec copy -acodec copy -ss 00:12:34.567 -t 00:34:56.789 OutputFile
可以,但输入有四个音轨,这样只能Stream #0:2[0x2da](fra)
获取第一个 ( ) 音频。我想要的是:要么是所有音频,要么是第三个 ( Stream #0:3[0x2db](qaa)
)。如何调整?
ffmpeg
因此应努力:
1. 截掉第一个文件的开头(从 1 小时 40 分钟的文件中删除前 2 分钟)
2. 将第二个(1小时)文件拆分为两部分(3.05分钟后)
3. 将分割第二个文件得到的 3.05 分钟部分连接(附加)到第一个文件的末尾。
我已尝试过:
Openshot:不转码就无法处理。
Avidemux (Linux):尝试保存时显示“这与 MPEG 不兼容 - 您不能使用复制编解码器。”
Windows 中的 Avidemux:音频不同步。
答案1
如何ffmpeg
在保留所有音轨的情况下分割和合并文件?
正如您所发现的,比特流复制将仅选择一(音频)轨道,按照流规范文档:
默认情况下,
ffmpeg
输入文件中每种类型(视频、音频、字幕)仅包含一个流,并将其添加到每个输出文件中。它会根据以下标准挑选出“最佳”流:对于视频,它是分辨率最高的流;对于音频,它是通道最多的流;对于字幕,它是第一个字幕流。如果同一类型的多个流的速率相同,则选择索引最低的流。
选择全部音轨:
ffmpeg -i InputFile.ts-c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a FirstFile.ts
要选择第三音轨:
ffmpeg -i InputFile.ts -c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a:2 FirstFile.ts
您可以在以下位置阅读更多内容并查看流选择的其他示例高级选项文档部分ffmpeg
。
我还会将-vcodec copy -acodec copy
您的原始命令与-c copy
上述命令进行组合,以提高表达的紧凑性。
分裂:
因此,将这些与您想要在两个文件中实现的目标结合起来,以便稍后重新加入:
ffmpeg -i InputOne.ts -ss 00:02:00.0 -c copy -map 0:v -map 0:a OutputOne.ts
ffmpeg -i InputTwo.ts -c copy -t 00:03:05.0 -map 0:v -map 0:a OutputTwo.ts
会给你:
OutputOne.ts
,这就是一切后第一个输入文件的前两分钟OutputTwo.ts
, 哪一个是第一的第二个输入文件的3分5秒
加入:
ffmpeg
支持文件连接而无需重新编码,在其连接文档中详细描述。
创建要合并的文件列表(例如join.txt
):
file '/path/to/files/OutputOne.ts'
file '/path/to/files/OutputTwo.ts'
然后你的ffmpeg
命令可以使用concat demuxer
:
ffmpeg -f concat -i join.txt -c copy FinalOutput.ts
由于您正在使用mpeg
传输流(.ts
),因此您应该能够使用连接协议以及:
ffmpeg -i "concat:OutputOne.ts|OutputTwo.ts" -c copy -bsf:a aac_adtstoasc output.mp4
根据上面链接的 concat 页面上的示例。我将留给您自己去尝试。
答案2
作为基于主要答案的简化答案:
保留起点之后的数据(直到结束):
ffmpeg -i INPUT -c copy -ss START_TIME -map 0 OUTPUT
要保留两个时间点之间的数据:
ffmpeg -i INPUT -c copy -ss START_TIME -to END_TIME -map 0 OUTPUT
要在某个时间点之后保留一定持续时间的数据:
ffmpeg -i INPUT -c copy -ss START_TIME -t DURATION_TIME -map 0 OUTPUT
开始后保留一定时间的数据:
ffmpeg -i INPUT -c copy -t DURATION_TIME -map 0 OUTPUT
要保存从开始到某个时间点的数据:
ffmpeg -i INPUT -c copy -to TIME_POINT -map 0 OUTPUT
TIME 可能是秒数,或者 hh:mm:ss[.xxx] 格式的数字
要合并文件,请创建一个名为的文件,join.txt
内容为
file 'path-to-INPUT1'
file 'path-to-INPUT2'
file...etc
然后
ffmpeg -f concat -i join.txt OUTPUT
或者:
合并 mpeg 文件(包括传输文件)
ffmpeg -i "concat:INPUT-1|INPUT-2" -c copy -bsf:a aac_adtstoasc OUTPUT
作为一个 GUI 解决方案,我尝试过 Avidemux,但效果不好。在搜索 Linux 解决方案时,我发现了此评论这里指向Avidemux 夜间:
“您可以尝试 Avidemux,但不要使用稳定版。您应该尝试使用带有“Wine”的 win32 版本(是的,适用于 Windows)。它支持 H.264,您必须使用双箭头来找出关键帧,因为您无法在任何地方进行剪切(由于“long gop”问题...)。但是,就像每个这样的软件一样,您只能进行剪切,否则它会渲染(在过渡、效果等情况下)。 http://avidemux.org/nightly/win32/“
我已经在 Linux/Wine 上测试过,但它在 Windows 上也应该可以运行。
要合并文件,请使用文件打开添加第一个文件,然后文件追加对于其余的。
保存方法:文件 - 保存。