目前我有80mb电影,我想用ffmpeg转换成大约10mb或15mb.我知道会有质量损失,但他们需要有声音.有没有办法指定文件大小或更高的压缩比我以前做的
ffmpeg -i movie.mp4 -b 2255k -s 1280x720 movie.hd.ogv
Run Code Online (Sandbox Code Playgroud)
它们目前约为25mb
aer*_*tal 22
如果您要定位某个输出文件大小,最好的方法是使用H.264和双通道编码.
这里有一个很好的例子,但复制粘贴太大了:https: //trac.ffmpeg.org/wiki/Encode/H.264
您使用计算目标比特率bitrate = file size / duration并启动ffmpeg两次:一次分析媒体,第二次执行实际编码:
ffmpeg -y -i input -c:v libx264 -preset medium -b:v 555k -pass 1 -c:a libfdk_aac -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -preset medium -b:v 555k -pass 2 -c:a libfdk_aac -b:a 128k output.mp4
Run Code Online (Sandbox Code Playgroud)
编辑:H.265(HEVC)在压缩方面甚至更好(在某些情况下为H.264大小的50%),但支持尚未普及,因此现在坚持使用H.264.
Mar*_*nar 14
灵感来自 Hashbrown 的回答。此版本保持原始音频质量,并调整为目标大小。
./script original_video.mp4 size
大小 = 以 MB 为单位的整数
#!/bin/bash
target_video_size_MB="$2"
origin_duration_s=$(ffprobe -v error -show_streams -select_streams a "$1" | grep -Po "(?<=^duration\=)\d*\.\d*")
origin_audio_bitrate_kbit_s=$(ffprobe -v error -pretty -show_streams -select_streams a "$1" | grep -Po "(?<=^bit_rate\=)\d*\.\d*")
target_audio_bitrate_kbit_s=$origin_audio_bitrate_kbit_s # TODO for now, make audio bitrate the same
target_video_bitrate_kbit_s=$(\
awk \
-v size="$target_video_size_MB" \
-v duration="$origin_duration_s" \
-v audio_rate="$target_audio_bitrate_kbit_s" \
'BEGIN { print ( ( size * 8192.0 ) / ( 1.048576 * duration ) - audio_rate ) }')
ffmpeg \
-y \
-i "$1" \
-c:v libx264 \
-b:v "$target_video_bitrate_kbit_s"k \
-pass 1 \
-an \
-f mp4 \
/dev/null \
&& \
ffmpeg \
-i "$1" \
-c:v libx264 \
-b:v "$target_video_bitrate_kbit_s"k \
-pass 2 \
-c:a aac \
-b:a "$target_audio_bitrate_kbit_s"k \
"${1%.*}-$2mB.mp4"
Run Code Online (Sandbox Code Playgroud)
bc作为计算器并选择awk(不确定这是否很酷,但无论如何)NUL代替/dev/null和^代替\.Hashbrown 的回答(这里)/sf/answers/4068594141/
二通方法https://trac.ffmpeg.org/wiki/Encode/H.264#twopass
这是一种使用 bash 脚本自动执行此操作的方法
只需调用./script.sh file.mp4 15for15mB
bitrate="$(awk "BEGIN {print int($2 * 1024 * 1024 * 8 / $(ffprobe \
-v error \
-show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 \
"$1" \
) / 1000)}")k"
ffmpeg \
-y \
-i "$1" \
-c:v libx264 \
-preset medium \
-b:v $bitrate \
-pass 1 \
-an \
-f mp4 \
/dev/null \
&& \
ffmpeg \
-i "$1" \
-c:v libx264 \
-preset medium \
-b:v $bitrate \
-pass 2 \
-an \
"${1%.*}-$2mB.mp4"
Run Code Online (Sandbox Code Playgroud)
注意我正在切断音频