使用ffmpeg进行视频重新编码 [英] Video recoding with ffmpeg

查看:388
本文介绍了使用ffmpeg进行视频重新编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在另一个问题(http://stackoverflow.com/questions/8012494/sorry-this-video-cannot-be-played-streaming-mp4-to-android/8012874#8012874)中提出关于android中视频播放的问题使用VideoView。显然,由于我的视频被编码的方式,因为另一个视频(网络上的512Kb mp4)使用我的代码正常播放的问题。由于我的最终用户将视频上传到网站,我无法对视频进行任何控制,但我可以控制重新编码这些视频。我使用 ffmpeg 重新编码它们,使其成为标准的MP4(H.264 + AAC)格式,并将其缩放到相同的大小(320x240)。

I asked in another question (http://stackoverflow.com/questions/8012494/sorry-this-video-cannot-be-played-streaming-mp4-to-android/8012874#8012874) about video playback in android using VideoView. Apparently, the problem there is due to the way my video is encoded, as another video (512Kb mp4 off the web) plays correctly using my code. As videos are uploaded by my end users to the web site, I don't have any control of the videos themselves, however I do have control over re-coding these. I re-code them using ffmpeg to bring them to a standard MP4 (H.264+AAC) format and scale them to the same size (320x240).

这是无法播放的视频的ffmpeg信息:

Here's the ffmpeg info of a video that would not play:

sh-3.2$ ffmpeg -i video.bad.mp4
FFmpeg version SVN-r25679-snapshot, Copyright (c) 2000-2010 the FFmpeg developers
  built on Nov  5 2010 09:34:37 with gcc 4.3.2
  configuration: --prefix=/usr --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-libgsm --enable-x11grab --enable-libx264 --enable-libtheora --extra-cflags=-Wall --enable-swscale --enable-libdc1394 --enable-nonfree --disable-mmx --disable-stripping --enable-avfilter --disable-altivec --disable-armv5te --disable-armv6 --disable-vis --enable-nonfree --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3
  libavutil     50.32. 6 / 50.32. 6
  libavcore      0.12. 0 /  0.12. 0
  libavcodec    52.94. 3 / 52.94. 3
  libavformat   52.84. 0 / 52.84. 0
  libavdevice   52. 2. 2 / 52. 2. 2
  libavfilter    1.56. 0 /  1.56. 0
  libswscale     0.12. 0 /  0.12. 0
  libpostproc   51. 2. 0 / 51. 2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.bad.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf52.84.0
  Duration: 00:00:45.93, start: 0.000000, bitrate: 591 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 320x240 [PAR 1:1 DAR 4:3], 535 kb/s, 15 fps, 15 tbr, 15 tbn, 30 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 51 kb/s

这里是正确播放的视频的ffmpeg信息:

And here's the ffmpeg info of a video that plays correctly:

sh-3.2$ ffmpeg -i video.mp4
FFmpeg version SVN-r25679-snapshot, Copyright (c) 2000-2010 the FFmpeg developers
  built on Nov  5 2010 09:34:37 with gcc 4.3.2
  configuration: --prefix=/usr --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-libgsm --enable-x11grab --enable-libx264 --enable-libtheora --extra-cflags=-Wall --enable-swscale --enable-libdc1394 --enable-nonfree --disable-mmx --disable-stripping --enable-avfilter --disable-altivec --disable-armv5te --disable-armv6 --disable-vis --enable-nonfree --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3
  libavutil     50.32. 6 / 50.32. 6
  libavcore      0.12. 0 /  0.12. 0
  libavcodec    52.94. 3 / 52.94. 3
  libavformat   52.84. 0 / 52.84. 0
  libavdevice   52. 2. 2 / 52. 2. 2
  libavfilter    1.56. 0 /  1.56. 0
  libswscale     0.12. 0 /  0.12. 0
  libpostproc   51. 2. 0 / 51. 2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: mp41
    title           : crazytown - http://www.archive.org/details/Cartoon-Crazytown
    encoder         : Lavf51.10.0
  Duration: 00:07:50.40, start: 0.000000, bitrate: 578 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 320x240, 510 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 63 kb/s

我在这里有两个问题。首先,我的坏视频中的哪些细节Android不喜欢?而且,第二,ffmpeg应该使用什么参数来重新编码我的视频?现在我使用这个:

I have two questions here, actually. First, which of the details in my "bad" video does android not like? And, second, what parameters should I use with ffmpeg to recode my videos? As present I use this:

ffmpeg -i $input_video_file -y -s 320x240 -vcodec libx264 -vpre medium -acodec libfaac -b 510K -ar 48000 -aspect 4:3 $tmpfile.mp4
qt-faststart $tmpfile.mp4 $output_video_file.mp4

但是这会产生一个在Android上无法播放的视频。非常感谢任何帮助。

But this produces a video that's not playable on android. Any help is greatly appreciated.

推荐答案

首先,您的ffmpeg版本已经超过一年了。去年以来,ffmpeg和H.264已经有了很大改进。请尝试升级到至少ffmpeg-0.7。

First, your version of ffmpeg is over a year old. A lot has improved with ffmpeg and H.264 since last year. Please try upgrading to at least ffmpeg-0.7.

有一点难以确切地告诉问题是什么,因为ffmpeg不显示传递给x264的所有选项.264编码。尝试增加ffmpeg输出的详细程度(在ffmpeg命令的开头附近使用 -v 1 -v 2 )。但是根据我使用ffmpeg来转码Android视频的经验,我的猜测是,您没有使用H.264基准配置文件(请参阅关于H.264的维基百科文章如果你好奇)。如果您有ffmpeg-0.7或更高版本,请尝试添加 -profile baseline

It's a little difficult to tell exactly where the problem is because ffmpeg isn't displaying all the options passed to x264 for H.264 encoding. Try increasing the verbosity of ffmpeg output (using -v 1 or -v 2 somewhere near the beginning of the ffmpeg command). But based on my experience using ffmpeg to transcode videos for Android, my guess is that you're not using the H.264 Baseline profile (see the wikipedia article on H.264 if you're curious). Try adding -profile baseline if you have ffmpeg-0.7 or later.

如果您无法升级ffmpeg由于某种原因,您可以在指定 -vpre medium -vpre baseline 选项指定基准配置文件>。如果由于某些原因您尝试使用基准预置,您可以手动强制基线选项通过指定 -coder 0 -bf 0 -flags2 -wpred-dct8x8 -vpre medium 之后的命令行。

If you can't upgrade your ffmpeg for some reason or another, you can specify the Baseline profile by using the -vpre baseline option after you specify -vpre medium. If for some reason you get an error trying to use the Baseline preset, you can manually force the Baseline options by specifying -coder 0 -bf 0 -flags2 -wpred-dct8x8 on the command line after the -vpre medium.

这篇关于使用ffmpeg进行视频重新编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆