iMovie(不是無損的,但是比以前更好)
iMovie v10(最初是在提出問題後發布的)現在可以更好地處理更多媒體類型,因此避免了 import重新編碼用於大多數H.264(mp4,m4v,mov,AVHDC,mts,mt2s)內容。
它仍然會在導出時重新編碼,因此從技術上講不會無損-另一項新功能但是,此功能的特點是可以自定義出口質量,這幾乎可以做到無損。我懷疑答案的這一部分可以同樣適用於其他“項目驅動”的視頻編輯軟件(例如Premiere或Final Cut),因為我認為它們通常都在輸出時重新編碼,儘管通常非常容易用於精確修整。 / p>
我個人通常認為一次重新編碼不是一個大問題,但是請理解您確實要求無損解決方案,所以...
無損(但更多)
在技術上有一定的局限性,例如您可以在不重新編碼至少一部分視頻的情況下裁剪視頻的精確度,它基本上取決於i幀頻率。如果每個幀都是i幀,則可以在任何地方剪切,但是如果只有幾秒鐘,則只能在這些i幀處無損地剪切,而不會丟失內容或重新編碼(至少一部分)。
ffmpeg
這個SO Q&A特別提出了一個問題,即如何使用 ffmpeg
。我不知道有任何GUI應用程序可以執行此操作,但是基本上您運行的命令如下:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00: 01:20.000 -t 00:37:50.000 output.m4v
指定的兩次是 start 和 duration ,可以是指定為秒或 hh:mm:ss.ss
,並且 -acodec副本
和 -vcodec副本
告訴ffmpeg不要重新編碼
我不確定如果剪切得太早會發生什麼,但是我認為,直到遇到i幀之前,視頻基本上是空白的(或者可能是損壞的,具體取決於播放器)。因此,您可能想要在剪切之前找到最近的i框架。 此答案使用 ffprobe
和 awk
解決了該問題,儘管有點尷尬。本質上,您使用 ffprobe
掃描幀並找到理想切點之前最接近的關鍵幀( flags = K
)。視頻每一幀的完整輸出可以如下所示:
ffprobe -select_streams v -show_frames <INPUT>
鏈接的答案提供了此命令來查找在特定時間之前的關鍵幀:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 | awk -F ='/ pict_type = / {如果(index($ 2,“ I”)){i = 1; } else {i = 0; }} / pkt_pts_time / {if(i(i &&($ 2 > = 150))打印$ 2; }'| head -n 1
最後,如果您確實需要在兩個i幀之間剪切某處,則可以拆分視頻並重新加入。根據此答案的信息,它應該類似於:
ffmpeg -f concat -i list_of_videos.txt -c複製OUTPUT.mp4
其中 list_of_videos.txt
是一個簡單的文本文件,列出要連接的文件。
摘要
iMovie可能不錯
ffmpeg可以一點點地無損(或非常接近無損)地完成此操作,對於大多數情況(從v10開始)就足夠了。難度的高低取決於您對精確起點的挑剔程度以及i幀的頻率。