【问题标题】:Video recoding with ffmpeg使用 ffmpeg 进行视频重新编码
【发布时间】:2011-12-23 15:06:37
【问题描述】:

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

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

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 信息:

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 中使用哪些参数来重新编码我的视频?目前我使用这个:

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 上播放的视频。非常感谢任何帮助。

【问题讨论】:

  • 嗨 Aleks,请问您是如何成功在 android 中运行 FFmpeg 命令的?这对我来说真的很重要。谢谢。
  • @iSun 我不在 android 中运行该命令。 FFmpeg 在我的网络服务器上运行,然后由安卓设备检索视频。
  • 啊哈,你知道在android中运行命令的方法吗?
  • @iSun 简单的答案是“没有办法做到这一点”。您可能能够在有根设备上执行某些操作,但您甚至无法安装 ffmpeg。除此之外,请查看System.exec 电话。我不知道它是否甚至在 android 上受支持 - 从未尝试过。

标签: android video ffmpeg


【解决方案1】:

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

要准确判断问题出在哪里有点困难,因为 ffmpeg 没有显示传递给 x264 以进行 H.264 编码的所有选项。尝试增加 ffmpeg 输出的详细程度(在 ffmpeg 命令开头附近的某处使用-v 1-v 2)。但根据我使用 ffmpeg 为 Android 转码视频的经验,我猜你没有使用 H.264 Baseline 配置文件(如果你好奇,请参阅the wikipedia article on H.264)。如果您有 ffmpeg-0.7 或更高版本,请尝试添加 -profile baseline

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

【讨论】:

  • 非常感谢!由于我现在无法升级 ffmpeg,我不得不选择其他选项。将-vpre baseline 添加到命令行就可以了!它现在可以在手机上正确播放。
猜你喜欢
  • 2020-09-24
  • 2014-05-02
  • 2015-08-18
  • 1970-01-01
  • 2011-04-15
  • 2017-01-10
  • 2013-07-18
  • 1970-01-01
  • 2017-02-02
相关资源
最近更新 更多