【问题标题】:FFMpeg command to convert from avi to mp4 in php scriptFFMpeg 命令在 php 脚本中从 avi 转换为 mp4
【发布时间】:2019-02-18 17:03:02
【问题描述】:

下面的ffmpeg命令从avi文件转换为mp4文件确实会创建mp4文件,但它的质量根本就不行。拳头,文件大小不一样,mp4要小很多,大约是avi文件的1/10。 其次,新创建的mp4播放时间短,大约0.1秒,而avi文件大约60秒。

谁能帮我用ffmpeg命令在下面的目录下从avi创建mp4文件?

for i in /xxxxxxx/xxxxxxx/*.avi; do
    ffmpeg -i "$i" -frames:v 1  "/xxxxxxx/xxxxxxx/$(basename "$i" .avi).mp4"
done     

尝试后记录:

[root@server-xxxxxxx-x ~]# for i in /xxxxxx/xxxxxxx/xxxxxxx/*.avi; do ffmpeg -i "$i" -pix_fmt yuv420p -movflags +faststart "/xxxxxx/xxxxxxx/xxxxxxx/$(basename "$i" .avi).mp4"; done
ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-18)
  configuration:
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
 Guessed Channel Layout for Input Stream #0.1 : mono
 Input #0, avi, from '/xxxxxx/xxxxxxx/xxxxxxx/09141944_5b9b910308858.avi':
  Metadata:
    creation_time   : 2018-09-14 00:18:07
    encoder         : CanonMVI06
   Duration: 00:00:04.20, start: 0.000000, bitrate: 12999 kb/s
    Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj422p(pc,    bt470bg/unknown/unknown), 640x480, 12384 kb/s, 30 fps, 30 tbr, 30 tbn, 30 tbc
     Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s
 File '/xxxxxx/xxxxxxx/xxxxxxx/09141944_5b9b910308858.mp4' already exists.    Overwrite ? [y/N]

                                                                                                                          y
 Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> mpeg4 (native))
  Stream #0:1 -> #0:1 (pcm_s16le (native) -> aac (native))
  Press [q] to stop, [?] for help
  [swscaler @ 0x3d75fa0] deprecated pixel format used, make sure you did set   range correctly
 Output #0, mp4, to '/xxxxxx/xxxxxxx/xxxxxxx/09141944_5b9b910308858.mp4':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: mpeg4 (mp4v / 0x7634706D), yuv420p, 640x480, q=2-31, 200 kb/s, 30 fps, 65521 tbn, 30 tbc
    Metadata:
      encoder         : Lavc57.107.100 mpeg4
     Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
     Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s
     Metadata:
       encoder         : Lavc57.107.100 aac
  [mp4 @ 0x3d0e6e0] Starting second pass: moving the moov atom to the  beginning of the file17x
  frame=  126 fps=0.0 q=11.8 Lsize=     310kB time=00:00:04.20 bitrate= 603.3kbits/s speed=6.21x
  video:270kB audio:35kB subtitle:0kB other streams:0kB global headers:0kB  muxing overhead: 1.605194%
  [aac @ 0x3d36f40] Qavg: 2283.534
  ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers
   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-18)
   configuration:
   libavutil      55. 78.100 / 55. 78.100
   libavcodec     57.107.100 / 57.107.100
   libavformat    57. 83.100 / 57. 83.100
   libavdevice    57. 10.100 / 57. 10.100
   libavfilter     6.107.100 /  6.107.100
   libswscale      4.  8.100 /  4.  8.100
   libswresample   2.  9.100 /  2.  9.100
   Guessed Channel Layout for Input Stream #0.1 : mono
   Input #0, avi, from '/xxxxxx/xxxxxxx/xxxxxxx/09141945_5b9b913e87834.avi':
    Metadata:
     creation_time   : 2018-09-14 00:18:07
     encoder         : CanonMVI06
    Duration: 00:00:04.20, start: 0.000000, bitrate: 12999 kb/s
    Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj422p(pc,      bt470bg/unknown/unknown), 640x480, 12384 kb/s, 30 fps, 30 tbr, 30 tbn, 30 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono,    s16, 705 kb/s

【问题讨论】:

  • 读起来好像和php无关,只是ffmpeg?
  • 哪个,我不太确定。 Php、ffmpeg 还是它们的组合?
  • 只是调用 ffmpeg 的结果有问题吗?
  • IdontDownVote,是的,我现在面临的问题是调用 ffmpeg 的结果。质量不只是很好,我认为 ffmpeg 命令不足以在这种特殊情况下制作质量文件。
  • 尝试添加 -preset slow -crf 22 如果 22 仍然看起来不太好,请降低它。真的,您只需要调整 ffmpeg 设置即可获得所需的结果:ffmpeg.org/ffmpeg.htmlstackoverflow.com/questions/3561715/…

标签: video ffmpeg mp4 avi


【解决方案1】:

问题:您没有支持的编码器

您的configuration 行是空白的。这意味着您没有启用 H.264/H.265 视频编码器。所以ffmpeg 选择输出 MPEG-4 Part 2 视频的原生编码器mpeg4。这是 HTML5 视频不支持的旧格式。

解决方案

编译

使用--enable-libx264--enable-libx265 编译。您还需要--enable-gpl 才能使用这些编码器。有关说明,请参阅本指南:

FFmpeg Wiki: Compile for RHEL/Fedora/CentOS

或下载

另外,一个简单的方法是download 一个已经编译的ffmpeg 并将它放在你的PATH 中的某个位置,例如/usr/local/bin。或者,如果您希望它位于任意位置,请确保您的脚本提供可执行文件的完整路径。确保这个新的ffmpeg 被执行,而不是你的旧的、残废的。

【讨论】:

  • 我认为 openh264 支持它而不必是 GPL...FWIW stackoverflow.com/a/39338135/32453
  • 我已经一步一步完成了所有编译和安装部分,没有错误(我实际上做了两次。)(没有更新部分)现在我在 ffmpeg_sources 文件夹中有 ffmpeg,所以看起来像 [root@server-xxx-x ~]# ffmpeg_sources/ffmpeg 而不是 [root@server-xxx-x ~]# ffmpeg 之前。但是,当我从同一个转换命令行尝试它时,我收到了与之前相同的消息,说 Video: mpeg4.更改后是否必须更改命令行?即使在编译没有错误之后,编译似乎也没有影响任何东西。我一直在努力。有什么建议吗?
  • LordNeckbeard,非常感谢。最后,通过ffmpeg成功将avi文件转换为mp4文件,音频和视频。我也为我对上述评论的困惑表示歉意。在我花了大约 2 天的时间进行编译之后没有结果,因为我猜我的操作系统版本对于那些文件来说太旧了,我尝试了已经编译的 ffmpeg,这花了我大约 15 分钟,它工作了。我非常感谢您的支持。谢谢 IdontDownVote 和 rogerdpack。
  • @user27240 至于为什么它在编译后不起作用——我猜即使你编译了ffmpeg,你的脚本仍在执行残废的旧ffmpeg。看来您可能已经以 root 身份编译,所以新的 ffmpeg 本来应该在 /root/bin 中,但是执行 PHP 脚本的用户可能无法访问,所以将 /root/bin/ffmpeg 移动到 /usr/local/bin 或某处否则在您的PATH 中,或使用脚本中可执行文件的完整路径。
  • LordNeckbeard,我对我安装的那三个 ffmpeg 感到困惑,但是当我输入 whereisffmpeg 然后它会返回 ffmpeg: /usr/local/bin/ffmpeg 所以,我认为是对的一个是它应该在的位置,我还重命名了其他两个 ffmpeg,如 ffmpeg2 或 3。但是,我面临新问题,即 chrome 是唯一可以从 avi 转换为 mp4 的浏览器,以及 safari、IE 和别人不会让我。有什么办法可以通过更改 ffmpeg 命令行来解决这个问题?或者有什么方法可以通过从avi到mp4的转换日志文件检查ffmpeg的安装方式?
猜你喜欢
  • 2015-08-20
  • 2019-02-17
  • 1970-01-01
  • 2014-07-12
  • 2014-11-04
  • 2013-03-24
  • 2017-05-21
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多