2016-02-01 113 views
2

我需要快速和不拆分大的视频文件分割成多个部分的文件有错误。基本的想法是,我有一个2GB的视频文件,我想改变成多种格式。我已阅读编码到一个不同的格式时,一些编码器不能使用超过1个核心。所以,我有想法,这取决于有多少内核具有可单独服务器上的大文件(这是非常快的)分成4/8片。将每个片段重新编码为新格式,然后使用这些格式按顺序显示视频。FFmpeg的分裂大文件

所以

testfile.mp4

变得

  1. testfile_piece_1.mp4
  2. testfile_piece_2.mp4
  3. testfile_piece_3.mp4
  4. testfile_piece_4.mp4

这些可以被单独转换。

的解决方案不应该是特定的格式。但是我发现了mp4文件的问题。

我已经尝试了下面的命令,它工作得很好,而且速度很快,但是会创建带有错误的文件。

ffmpeg -i testfile.mp4 -ss 00:00:00 -t 00:20:00 -c copy testfile_piece_1.mp4 

当我在VLC上播放testfile_piece_1.mp4时,它工作正常。将分割文件转换为不同高度和宽度的mp4文件时出现问题。我会得到“未找到的moov原子”类似的错误

我尝试添加-movflags faststart没有运气

我然后在这个库https://code.google.com/archive/p/moovrelocator/其固定在MOOV问题来了,但随后我会得到有关于错误aac“打开编码器输出流#0.0时出错 - 可能是不正确的参数,如bit_rate,rate,width或height”

拆分文件的另一种方式是无用的,但涉及重新编码文件。对于较小的文件大小来说不算太坏,但2GB文件可能需要几天才能完成。

有没有办法快速拆分largr文件而不产生有错误的文件?我一直在努力工作好几天没有运气。

控制台输出的评论 - FFmpeg splitting large files

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/usr/share/nginx/html/uploads/testfile01.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf56.36.100 
    Duration: 00:05:02.08, start: 302.120000, bitrate: 3254 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p(tv, bt709)         , 1920x1080 [SAR 1:1 DAR 16:9], 3252 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (de         fault) 
    Metadata: 
     handler_name : VideoHandler 
[libx264 @ 0x165ffc0] width not divisible by 2 (853x480) 
Output #0, mp4, to '/usr/share/nginx/html/uploads/testfile01_480.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf56.36.100 
    Stream #0:0(und): Video: h264, none, q=2-31, 128 kb/s, SAR 2560:2559 DAR 0:0         , 25 fps (default) 
    Metadata: 
     handler_name : VideoHandler 
     encoder   : Lavc56.41.100 libx264 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) 
Error while opening encoder for output stream #0:0 - maybe incorrect parameters         such as bit_rate, rate, width or height 

控制台输出2

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/usr/share/nginx/html/uploads/testfile.mp4': 
    Metadata: 
    major_brand  : dash 
    minor_version : 0 
    compatible_brands: iso6avc1mp41 
    creation_time : 2016-01-24 04:26:37 
    Duration: 01:15:58.08, start: 0.000000, bitrate: 3163 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 3161 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc (default) 
    Metadata: 
     creation_time : 2016-01-24 04:26:37 
     handler_name : VideoHandler 
[segment @ 0x1197060] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
Output #0, segment, to '/usr/share/nginx/html/uploads/testfile%02d.mp4': 
    Metadata: 
    major_brand  : dash 
    minor_version : 0 
    compatible_brands: iso6avc1mp41 
    encoder   : Lavf56.36.100 
    Stream #0:0(und): Video: h264 (avc1/0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 3161 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default) 
    Metadata: 
     creation_time : 2016-01-24 04:26:37 
     handler_name : VideoHandler 
Stream mapping: 
    Stream #0:0 -> #0:0 (copy) 
Press [q] to stop, [?] for help 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 
[mp4 @ 0x11512a0] Codec for stream 0 does not use global headers but container format requires global headers 

回答

6

使用段复用器打破输入成段:

ffmpeg -i testfile.mp4 -c copy -f segment -segment_time 1200 testfile_piece_%02d.mp4 

这将分割所述源在关键帧中,所以细分可能不完全是1200秒。时间戳没有重置,所以有些玩家将无法玩第二和第二段。如果需要的可玩性,插入-reset_timestamps 1

并行编码之后,你可以先创建一个文本文件seg.txt这样

file 'encoded_testfile_piece_00.mp4' 
file 'encoded_testfile_piece_01.mp4' 
file 'encoded_testfile_piece_02.mp4' 
file 'encoded_testfile_piece_03.mp4' 

,然后运行

ffmpeg -f concat -i seg.txt -c copy -fflags +genpts encoded_full.mp4 
+0

感谢我给它一个镜头 –

+0

'十字绣产生段ffmpeg -i testfile.mp4 -vcodec libx264 -preset slow -vf scale = -1:480 -acodec copy testfile_480.mp4'运行时我仍然得到错误,同时打开编码器输出流#0:0 - 可能是不正确的参数如bit_rate,rate,width or height' –

+0

我刚刚注意到错误来自[libx264 @ 0x165ffc0]宽度不能被2整除(853x480)' –