代码之家  ›  专栏  ›  技术社区  ›  espenhogbakk

如何用ffmpeg最好地转换与flash兼容的mp4文件?

  •  17
  • espenhogbakk  · 技术社区  · 17 年前

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

    到目前为止,我有这个,这是可行的,但它没有发挥在一个闪存播放器的原因。结果不是很好,我该如何改进这种转换?

    这是我使用的命令:

    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 回复  |  直到 11 年前
        1
  •  14
  •   Stu Thompson Helter Scelter    16 年前

    要创建交错元数据(允许中间流恢复和倒带/转发),请使用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播放器中正常运行。

        2
  •  4
  •   tst    17 年前

    FLV和MP4是媒体容器。

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

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

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

    flash只能在flv容器中播放视频编解码器h.264。

    所以参数应该是这样的:

    -f flv -vcodec libx264
    
        3
  •  4
  •   janosrusiczki    16 年前

    在我的代码片段集合中,我有以下任务。

    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。别问我其他参数是什么。:)

    与MP4盒交错:

    MP4Box -inter 500 output.mp4
    

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

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

    希望这有帮助。

        4
  •  3
  •   slacy    17 年前

    我使用一系列的命令来完成这个任务,从mencoder开始。(见下面的脚本)。诀窍在于ffmpeg(和mencoder)的mp4文件输出通常不兼容flash,因为它是交错的,而且它们不能很好地控制这种行为。所以,我生成一个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
    
        5
  •  2
  •   alex strange    17 年前

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

        6
  •  1
  •   Justin Buser    14 年前

    实际上,你不应该使用最大速率,尤其是当你的比特率显式设置为200k时,最大速率不能为10000k。事实上,再仔细看一看,我真的认为你不明白这些东西的用途:)

    首先,您调用的是输入文件output.mp4,再加上输出文件(对于pass 1,它实际上应该是/dev/null)称为yourinfile.avi,而您实际上还没有设置容器格式,因此最终将得到一个h264编码的avi文件。

    对于高质量1080p hd flash兼容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配合得很好+

        7
  •  0
  •   olle    17 年前

    只是想知道为什么会这样

    • MP4仅在Flash 9.0.115.0或更高版本中受支持,您使用的是什么版本?
    • 承载该文件的Web服务器是否设置了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
    
        8
  •  0
  •   grapefrukt    17 年前

    我在网上的某个地方找到了这个片段(非常冗长,我不知道其中一半是什么)。它是为两次传球而设计的,所以它在第一次传球时不会输出任何视频,您需要将其设置为 -通过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