如何使用FFMPEG最佳地转换Flash兼容的mp4文件?

时间:2009-01-17 14:13:52

标签: flash ffmpeg flash-video

我正在尝试使用ffmpeg将不同的文件转换为兼容闪存的.mp4文件,但我似乎无法让它工作。当然,目标是以最小的文件大小获得最高质量。

到目前为止,我有这个,它有效,但由于某种原因它不能在Flash播放器中播放。结果不是那么好,我该如何改进这种转换呢?

这是我正在使用的命令:

ffmpeg -i input.file -f mp4 -vcodec mpeg4 -r 25 -b 560000 -s 610x340 -acodec aac -ac 2 -ab 64 -ar 44100 output.file

8 个答案:

答案 0 :(得分:14)

要创建交错元数据(允许中间流恢复和倒带/转发),请使用gpac实用程序(例如,包含在medibuntu中)重新交错文件。使用FFmpeg 0.5或更高版本转换为mp4,如下所示:

ffmpeg -f mp4 -i video.mov -b 400k video.mp4

然后

/usr/bin/MP4Box -inter 500 video.mp4

多田!完成!这将在JW Flv或其他Flash播放器中正确传输。

答案 1 :(得分:4)

FLV和MP4是媒体容器。

MPEG-4第2部分和H.264是视频编解码器。 (和H.264提供更好的质量)

libx264是H.264编解码器的编码器。

mpeg4是MPEG-4第2部分编解码器的编码器。

Flash只能在FLV容器中播放视频编解码器H.264。

所以params应该是这样的:

-f flv -vcodec libx264

答案 2 :(得分:4)

在我的代码段集合中,我有以下内容完成此任务。

ffmpeg第一遍:

ffmpeg -y -i input.mp4 -pass 1 -vcodec libx264 -b 2000k -g 300 -bf 3 -refs 6 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method umh -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 3 -flags2 +dct8x8+wpred+bpyramid+mixed_refs -trellis 1 -partitions +parti8x8+parti4x4+partp8x8+partp4x4+partb8x8 -acodec libfaac -ab 128k output.mp4

ffmpeg第二遍:

ffmpeg -y -i input.mp4 -pass 2 -vcodec libx264 -b 2000k -g 300 -bf 3 -refs 6 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method umh -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 3 -flags2 +dct8x8+wpred+bpyramid+mixed_refs -trellis 1 -partitions +parti8x8+parti4x4+partp8x8+partp4x4+partb8x8 -acodec libfaac -ab 128k output.mp4

质量设置为2000k =视频比特率,128k =音频比特率,300 = GOP。不要问我其他参数是什么。 :)

与MP4Box交错:

MP4Box -inter 500 output.mp4

创建缩略图/海报图像(使用5来播放以获得所需图像)

ffmpeg -itsoffset -5 -i output.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 1280x720 thumbnail.jpg

希望这有帮助。

答案 3 :(得分:3)

我使用一系列命令来执行此操作,从mencoder开始。 (见下面的脚本)。诀窍是ffmpeg(和mencoder的)mp4文件输出通常不是闪存兼容的,因为它是交错的方式,并且它们不能很好地控制这种行为。所以,我生成一个AVI文件然后使用mp4box以我想要的方式重新启动它。这是我的完整脚本,希望得到一个.avi文件,并生成一个可以播放flash的.mp4文件。

#!/bin/bash
#
ORIGDIR=`pwd`
FILE=$@
VID_OUTPUT=${FILE/.AVI/.tmp.avi}
FINAL_OUTPUT=${FILE/.AVI/.mp4}
MENCODER=~/src/mplayer/svn/mplayer/mencoder
BITRATE=500
RES=640:480
LOG=mencoder.$FILE.log

TEMPDIR=`mktemp -d /tmp/transcode.XXXXXXXX`
pushd $TEMPDIR
echo "Pass 1"

PARAMS=keyint=250:bframes=0:qp_min=10:qp_max=51:turbo=1:mixed_refs=0:frameref=1:deblock=0,0:qblur=0:vbv_bufsize=10000:vbv_maxrate=10000:keyint_min=25:me=hex:me_range=16:ip_factor=1.4:pb_factor=1.3:chroma_qp_offset=0:vbv_init=0.9:ratetol=1.0:cplx_blur=20:nocabac:noweight_b:nob_pyramid:partitions=p8x8,b8x8,i4x4:no8x8dct:nossim:deadzone_inter=21:deadzone_intra=11

EXTRA_PARAMS=subq=5:trellis=0:

$MENCODER $ORIGDIR/$FILE -o $VID_OUTPUT -oac faac -srate 44100 -ovc x264 -x264encopts bitrate=$BITRATE:$PARAMS:pass=1 -vf scale=$RES 2>&1 >> $LOG
echo "Pass 2"
$MENCODER $ORIGDIR/$FILE -o $VID_OUTPUT -oac faac -srate 44100 -ovc x264 -x264encopts bitrate=$BITRATE:$PARAMS:pass=2 -vf scale=$RES 2>&1 >> $LOG
MP4Box -aviraw video $VID_OUTPUT
MP4Box -aviraw audio $VID_OUTPUT
TEMP_AUDIO=${VID_OUTPUT/.avi/}_audio.raw
AAC_AUDIO=${TEMP_AUDIO/.raw/.aac}
H264_VIDEO=${VID_OUTPUT/.avi/}_video.h264
echo TEMP is $TEMP_AUDIO
echo AAC is $AAC_AUDIO
echo H264 is $H264_VIDEO
mv $TEMP_AUDIO $AAC_AUDIO
MP4Box -add $H264_VIDEO:fps=29.97 -add $AAC_AUDIO $FINAL_OUTPUT
mv $LOG $ORIGDIR
mv $FINAL_OUTPUT $ORIGDIR
popd
echo Files left in $TEMPDIR
# rm -fr $TEMPDIR

答案 4 :(得分:2)

如果您使用ffmpeg制作.mp4s,请查看ffpresets /目录并使用-vpre。默认选项(对于所有编解码器,尤其是libx264)非常糟糕,实际上所有这些选项都应设置为自定义。 -vpre负责x264的大部分工作。

答案 5 :(得分:1)

实际上,当你的比特率明确设置为200k时,你不应该使用maxrate,特别是maxk不是10000k。事实上,更接近这一点,我真的不认为你理解大部分内容是什么:)

对于初学者,你正在调用输入文件output.mp4,加上输出文件(实际上应该是/ dev / null for pass 1)被称为yourinfile.avi并且你实际上没有设置容器格式所以是什么你最终得到的是一个h264编码的avi文件。

尝试使用高质量1080p高清闪存兼容的h264编码MPEG-4视频,首先在与您编码的视频相同的目录中创建一个包含以下内容的文件,并将其命名为flash-mp4.ffpreset

vcodec=libx264
b=5000k
acodec=libfaac
ab=256k
ac=2
ar=44100
coder=1
flags=+loop+mv4
cmp=+chroma
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
me_method=umh
subq=8
me_range=16
g=250
keyint_min=25
sc_threshold=40
i_qfactor=0.71
b_strategy=2
qcomp=0.6
qmin=10
qmax=51
qdiff=4
bf=3
refs=4
directpred=3
trellis=1
flags2=+wpred+mixed_refs+dct8x8+fastpskip
wpredp=2
fflags=+rtphint
profile=1

然后从命令行:

ffmpeg -y -i sourcefile.avi -fpre ./flash-mp4.ffpreset -f mp4 outputfile.f4v

这应该与flash 10 +完美搭配

答案 6 :(得分:0)

关于为什么会发生这种情况的一些想法

  • mp4仅在Flash 9.0.115.0或更高版本中受支持,您使用的是哪个版本?
  • 托管该文件的网络服务器是否具有mp4 mime类型设置?

在转换为FLV时会播放吗?这是一个选项吗?然后,您将使用类似以下选项的内容

ffmpeg -i input.file -f flv -r 25 -b 560000 -s 610x340 -acodec mp3 -ac 2 -ab 64 -ar 44100 output.file

答案 7 :(得分:0)

我发现这个(非常冗长,我不确定它的一半甚至是什么)在网络上的某个地方。这是为了进行两次传递,所以它不会在第一次传递时输出任何视频,你需要将其设置为 -pass 2 来运行第二次传递并输出实际视频。

ffmpeg -y -i output.mp4 -vcodec libx264 -acodec libfaac -ab 12000 -ac 2 -b 200000 -threads 2 -flags +loop -cmp +chroma -partitions 0 -subq 1 -trellis 0 -refs 1 -coder 0 -me_range 16 -g 300 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -maxrate 10M -bufsize 10M -rc_eq \’blurCplx^(1-qComp)\’ -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -s 304x224 -pass 1 yourinfile.avi

要在下载过程中逐步播放,您还需要将元数据移动到文件的开头。 ffmpeg把它放在最后,flash需要它才能开始播放。一个有用的工具是QTIndexSwapper