17

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

到目前为止,我有这个,它可以工作,但由于某种原因它不能在 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
4

8 回答 8

14

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

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

然后

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

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

于 2009-04-20T17:04:04.047 回答
4

FLV 和 MP4 是媒体容器。

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

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

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

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

所以参数应该是这样的:

-f flv -vcodec libx264
于 2009-03-06T10:19:05.257 回答
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

希望这可以帮助。

于 2010-05-18T11:44:08.163 回答
3

我使用一系列命令来执行此操作,从 mencoder 开始。(见下面的脚本)。诀窍是 ffmpeg(和 mencoder)的 mp4 文件输出通常不兼容闪存,因为它是交错的,并且它们不能很好地控制这种行为。所以,我制作了一个 AVI 文件,然后使用 mp4box 以我想要的方式重新混合它。这是我的完整脚本,预计将获得一个 .avi 文件,并生成一个可闪存播放的 .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
于 2009-03-06T23:03:47.213 回答
2

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

于 2009-04-28T00:43:31.797 回答
1

实际上,您不应该使用 maxrate,尤其是当您将比特率明确设置为 200k 时,不应该使用 10000k 的 maxrate。事实上,更仔细地看这个,我真的不认为你明白这些东西的大部分用途:)

对于初学者,您调用输入文件 output.mp4,加上输出文件(实际上应该是 /dev/null 用于第 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+ 完美配合

于 2011-09-16T04:32:10.373 回答
0

我在网络上的某个地方发现了这个(非常冗长,我不确定它的一半是什么)片段。它是为执行两遍而设计的,因此在第一遍时不会输出任何视频,您需要将其设置为 do -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

于 2009-01-17T19:47:11.477 回答
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
于 2009-01-17T17:39:38.193 回答