使用 ffmpeg 将 mp4 转换为 x264 时数据无效,但将 flv 转换为 x264 时数据正常

Invalid data when converting mp4 to x264 with ffmpeg but fine when converting flv to x264

我有一个 PHP 脚本可以将上传的视频转换为 x264,如果我上传 FLV 它可以正常工作,但是对于 MP4 它不起作用,这是命令和输出:

命令:

ffmpeg -y -i ../../flv/rjaRGKzSMtksUJ4kGbsLMYEcr.mp4 -crf 0 -vcodec libx264 -movflags faststart ../../flv/rjaRGKzSMtksUJ4kGbsLMYEcr.mp4 2>&1

输出:

ffmpeg version N-67321-ge5054c8 Copyright (c) 2000-2014 the FFmpeg developers
  built on Nov  1 2014 12:53:28 with gcc 4.8.2 (GCC) 20140120 (Red Hat 4.8.2-16)
  configuration: --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264
  libavutil      54. 11.100 / 54. 11.100
  libavcodec     56. 10.100 / 56. 10.100
  libavformat    56. 11.101 / 56. 11.101
  libavdevice    56.  2.100 / 56.  2.100
  libavfilter     5.  2.100 /  5.  2.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../../flv/rjaRGKzSMtksUJ4kGbsLMYEcr.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    creation_time   : 2018-10-08 12:03:53
    encoder         : Lavf56.15.102
  Duration: 00:03:03.08, start: 0.023129, bitrate: 1647 kb/s
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 720x404 [SAR 1:1 DAR 180:101], 1547 kb/s, 24 fps, 24 tbr, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 2018-10-08 12:03:53
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
    Metadata:
      creation_time   : 2018-10-08 12:03:53
      handler_name    : SoundHandler
[libx264 @ 0x1f0a080] using SAR=1/1
[libx264 @ 0x1f0a080] using cpu capabilities: MMX2 SSE Cache64
[libx264 @ 0x1f0a080] profile High 4:4:4 Predictive, level 3.0, 4:2:0 8-bit
[libx264 @ 0x1f0a080] 64 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=0 mixed_ref=1 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to '../../flv/rjaRGKzSMtksUJ4kGbsLMYEcr.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf56.11.101
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 720x404 [SAR 1:1 DAR 180:101], q=-1--1, 24 fps, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 2018-10-08 12:03:53
      handler_name    : VideoHandler
      encoder         : Lavc56.10.100 libx264
    Stream #0:1(und): Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, s16, 128 kb/s (default)
    Metadata:
      creation_time   : 2018-10-08 12:03:53
      handler_name    : SoundHandler
      encoder         : Lavc56.10.100 libfdk_aac
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
[mpeg4 @ 0x2004420] ac-tex damaged at 1 1
[mpeg4 @ 0x2004420] Error at MB: 47
[mpeg4 @ 0x2004420] concealing 1170 DC, 1170 AC, 1170 MV errors in P frame
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1ed3ec0] stream 1, offset 0xee5b: partial file
../../flv/rjaRGKzSMtksUJ4kGbsLMYEcr.mp4: Invalid data found when processing input
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1ed3ec0] stream 0, offset 0xef98: partial file
../../flv/rjaRGKzSMtksUJ4kGbsLMYEcr.mp4: Invalid data found when processing input
[mp4 @ 0x1f08f40] Starting second pass: moving the moov atom to the beginning of the file
frame=    3 fps=0.0 q=-1.0 Lsize=     116kB time=00:00:00.12 bitrate=7585.3kbits/s dup=1 drop=0    
video:113kB audio:2kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.171168%
[libx264 @ 0x1f0a080] frame I:1     Avg QP: 0.00  size:113785
[libx264 @ 0x1f0a080] frame P:2     Avg QP: 0.00  size:   518
[libx264 @ 0x1f0a080] mb I  I16..4: 38.4%  0.0% 61.6%
[libx264 @ 0x1f0a080] mb P  I16..4:  0.2%  0.0%  0.1%  P16..4:  1.2%  0.1%  0.2%  0.0%  0.0%    skip:98.3%
[libx264 @ 0x1f0a080] 8x8 transform intra:0.0% inter:3.1%
[libx264 @ 0x1f0a080] coded y,uvDC,uvAC intra: 91.6% 88.7% 88.7% inter: 0.7% 0.2% 0.2%
[libx264 @ 0x1f0a080] i16 v,h,dc,p: 46% 53%  1%  0%
[libx264 @ 0x1f0a080] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 44% 40%  3%  2%  3%  2%  2%  2%  2%
[libx264 @ 0x1f0a080] i8c dc,h,v,p:  2% 55% 43%  0%
[libx264 @ 0x1f0a080] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1f0a080] kb/s:7348.61

如您所见,那里有一些错误。我已经尝试使用来自不同来源的几个不同的 mp4 文件,所以这不是视频文件的问题。

我也尝试过不使用 -movflags faststart 选项,也尝试过使用 -q:v 0 而不是 -crf 0,没有任何效果,但如上所述,它适用于 FLV -> MP4 ,我做错了什么?

PS:"Nothing works" 我的意思是生成的 MP4 在浏览器中播放 1 帧后停止。

FFmpeg 不会就地编辑文件,所以输入不能与输出相同 - 直到最近*这没有被检查,所以 ffmpeg 将静默执行这样的指令,只要覆盖标志存在.

写入与输入不同的文件。

*2018-09-17