在 php 脚本中从 avi 转换为 mp4 的 FFMpeg 命令
FFMpeg command to convert from avi to mp4 in php script
下面的从avi文件转mp4文件的ffmpeg命令确实创建了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
问题:您没有支持的编码器
您的 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
被执行,而不是你的旧的,残废的。
下面的从avi文件转mp4文件的ffmpeg命令确实创建了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
问题:您没有支持的编码器
您的 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
被执行,而不是你的旧的,残废的。