[唔知點做] 一個video file 分成5秒一個file

頭細身細

18 回覆
0 Like 7 Dislike
頭細身細 2023-07-22 11:28:57
5秒 係一個variable
諗左2個可行方法
但係都係做唔到 有冇大神幫下手

ffmpeg: 但係要學太難 唔同encoder output既duration都會唔同 暫時未有一個簡單既方法
software (window機): 暫時未搵到
abyss752 2023-07-22 11:44:53
梗係ffmpeg
點會唔同encoder 就唔同duration 5秒就係5秒, 唔同encoder/codec 都一樣係5秒
唔通mpeg1 5秒 同 mp4 5秒係唔同
頭細身細 2023-07-22 12:16:11
係唔同 你試下segment mkv 20min既片 5秒一段
再concat番
會多左幾秒
漢語多功能字庫 2023-07-22 12:24:45
Open cv
騎野豬的生菜公主 2023-07-22 12:58:21
影片有個參數叫fps
(有啲encoder會用動態fps令到filesize再細啲)
有機會唔會有exactly 5s
因為影片係一個個frame咁計
假設你第 N個frame係去到4.966s
第N+1個frame =4.986s
第N+2個frame =5.006s

換言之你一係1 ~ N+1個frame, 出4.986s
一係 1~ N+2個frame, 出5.006s
騎野豬的生菜公主 2023-07-22 12:59:31
如果你要拎exactly 5s,
你要用ffmpeg轉做固定 50 fps
之後再cut frame
超膠 2023-07-22 13:11:02
ffmpeg -i input.mp4 -c copy -segment_time 5 -f segment output_%03d.mp4
頭細身細 2023-07-22 13:45:12
Thank you 不過試左了
頭細身細 2023-07-22 13:46:04
換句話講條片係 29.97 fps

我就set 29.97 既split time?
頭細身細 2023-07-22 13:48:49
原理係
我5秒Split
第1條 出 -> 5.006s
第2條由 5s 開始 所以係5 - 10.006s?
騎野豬的生菜公主 2023-07-22 13:49:39
29.97fps
一格frame 33.67ms

5秒整除唔到

你要轉哂一樣format再cut先可以exactly一樣duration
騎野豬的生菜公主 2023-07-22 13:53:37
唔一定
0~5.006s
5.0007s ~ 10.003s
encoder未必會真係啱啱好29.97fps

總之係基本上唔會exactly出個相同5s長度俾你
頭細身細 2023-07-22 14:03:00
但係如果係咁concat之後應該都唔會多左duration?????
定係佢係由5s既片拉長左做5.006s一條
假設我有100個 sub file
0.006 * 100
多左0.6 秒
騎野豬的生菜公主 2023-07-22 14:14:44
要睇你用咩tool去cut
有啲可能做咁4 寫5 入
頭尾frame冇左之類
加埋唔會還原到

你有需要可以尋求專家意見
或者問下chatgpt
https://github.com/mifi/lossless-cut
頭細身細 2023-07-22 14:24:41
thanks 已經明白左多好多
fourteen 2023-07-23 12:44:00
影片有個參數叫key frame
(有啲encoder會用scene change detection令到filesize再細啲)
有機會唔會有固定key frame
你可以用呢個magic去list key frame
ffprobe -loglevel error -show_entries frame=pts_time -skip_frame nokey -select_streams v:0 -of csv=print_section=0 "input.mp4"


當你用-c copy, ffmpeg會係key frame 到落刀,假設key frame 係
0.000000,
3.878878
6.965289
9.509500
14.931589
19.853167
21.813456

第1條片=6.965292s (第3個key frame)
第2條片=7.966292s (第5個key frame 14.931584)
第3條片=4.921583s (第6個key frame 19.853167)
第4條片=1.960292s (第7個key frame 21.813459)
所以係唔re-encode既情況下, 如果key frame 唔固定, 係拎唔到exactly 5s

你可以用呢個magic去check video length
ffprobe -v error -select_streams v:0 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "input.mp4"


當然如果fps唔係整數,都唔會整到exactly 5s
例如fps係24000/1001, 咁第120 frame 就會係5.005s
如果key frame固定係120 frame, 咁每條片長度就會係5.005s

你可以用呢個magic去check fps
ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate "input.mp4"


至於concat番會多左幾秒, 係因為斬出黎既video 既start time有啲古怪
你可以用呢個magic reset timestamps
ffmpeg -i "input.mp4" -c copy -segment_time 5 -f segment -reset_timestamps 1 -avoid_negative_ts 0 "output\output_%03d.mp4" 


唔知你係點concat,concat可以用呢個magic
(for %i in ("output\*.mp4") do @echo file '%i') > mylist.txt
ffmpeg -f concat -safe 0 -i "mylist.txt" -c copy "merge.mp4"


如果你唔介意re-encode, 可以用呢個magic 黎set keyframe 同fps, 咁應該可以exactly 5s.
ffmpeg -i "input.mp4" -c:v libx264 -crf 23 -x264-params keyint=120:scenecut=0 -filter:v fps=fps=24 "output.mp4"
ffmpeg -i "output.mp4" -c copy -segment_time 5 -f segment -reset_timestamps 1 -avoid_negative_ts 0 "output\output_%03d.mp4"


祝您使用ffmpeg愉快!
頭細身細 2023-07-23 13:41:58
多謝巴打你咁熱心先


5秒只不過係例子 我既目的係分拆做細video 然後做interpolation 再concat番
因為一條片有太多image file size會好大 同埋可以分file 下次先再做


就算我segment by keyframe個duration都係錯
頭先試埋re encode個duration都係唔一樣

之前搵左SVP Player for android 我應該用佢 唔搞了
Cyborgman 2023-07-24 21:58:08
咪即係hls streaming
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞