FFMPEG:

FFMPEG:

我也在尋找 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),因此您應該能夠使用 concat協定還有:

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,您必須使用雙箭頭來找出關鍵幀,因為您可以[不是]到處剪切(由於“長gop”的事情......但是,就像每個這樣的軟體一樣,您可以只剪切,否則它會渲染(在過渡,效果等的情況下)。 http://avidemux.org/nightly/win32/

我已經在 Linux/Wine 中測試過它,但它也應該在 Windows 中運作。

在此輸入影像描述

若要加入文件,請使用文件開啟新增第一個文件,然後文件追加對於其餘的。

保存:文件-保存。

相關內容