【问题标题】:Android FFmpeg reports "file protocol not found"Android FFmpeg 报告“找不到文件协议”
【发布时间】:2012-10-18 06:11:40
【问题描述】:

我正在尝试在 android 中使用 ffmpeg 命令将序列图像转换为视频。 我已经为 android 构建了 ffmpeg,并将 ffmpeg 二进制文件放在 /data/local 文件夹中。 我在 Android 中使用 Runtime.getruntime.execute("mycommand") 运行 ffmpeg 命令。

mycommand 的结构是这样的

"/data/local/ffmpeg -r 40 qscale 2 -i /mnt/sdcard/images/img%d.jpg /mnt/sdcard/images/finalvideo.mp4" 

mycommand 包含我放置所有序列图像的文件夹的路径。运行此命令会给我错误“找不到协议”。

我还读到文件协议是 ffmpeg 文档中的默认协议。

我怎样才能运行这样的命令?

运行 ffmpeg -i /mnt/sdcard/vid.mp4 等简单命令后出现的错误

ffmpeg version 0.11.1.git Copyright (c) 2000-2012 the FFmpeg developers
built on Sep 26 2012 11:58:35 with gcc 4.4.3 (GCC)
configuration: --target-os=linux --prefix=/home/esteves/android-ffmpeg --enable-cross-compile --enable-runtime-cpudetect --disable-asm --arch=arm --cc=/home/esteves/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --cross-prefix=/home/esteves/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- --disable-stripping --nm=/home/esteves/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-nm --sysroot=/home/esteves/android-ndk/platforms/android-8/arch-arm --enable-nonfree --enable-version3 --disable-everything --enable-gpl --disable-doc --enable-avresample --enable-demuxer=amr --enable-demuxer=aac --enable-demuxer=rawvideo --enable-demuxer=rtsp --enable-muxer=rtsp --enable-muxer=flv --enable-muxer=mpegts --enable-muxer=mp4 --enable-demuxer=rtp --enable-demuxer=rtp --disable-ffplay --disable-ffserver --enable-ffmpeg --disable-ffprobe --enable-libx264 --enable-encoder=libx264   libavutil      51. 72.100 / 51. 72.100
libavcodec     54. 55.100 / 54. 55.100
libavformat    54. 25.105 / 54. 25.105
libswscale      2.  1.101 /  2.  1.101
error of main   libswresample   0. 15.100 /  0. 15.100
error of main   libpostproc    52.  0.100 / 52.  0.100
/mnt/sdcard/vid.mp4: Protocol not found

【问题讨论】:

  • 您在qscale 之前忘记了-,它应该是-qscale,并且应该放在-i /mnt/…/img%d.jpg 选项之后
  • 我也尝试过使用它,但它给了我相同的消息 Protocol not found.I 尝试了另一个 ffmpeg 命令 /data/local/ffmpeg -i /mnt/sdcard/vid.mp4 将提供信息我的视频文件 vid.mp4。但是运行这个命令给了我同样的消息 Protocol not found.I got this command from link linuxstall.com/ffmpeg-tutorial.
  • edit 并发布您正在使用的新命令的完整、未删减的输出,而不仅仅是错误消息。粘贴后别忘了用Ctrl-K缩进代码。
  • 我用问题底部的错误日志更新我的问题

标签: android command-line ffmpeg


【解决方案1】:

这是 ffmpeg 编译问题。您应该在配置中启用协议相关。 这是我的配置,您可以参考:

export TMPDIR=/Users/yourpath/SourceCode/FFmpeg/tmpdir
NDK=/Users/yourpath/Android/android-ndk-r10d
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=/Users/yourpath/Android/android-ndk-r10d/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

CPU=arm
PREFIX=/Users/liuchao/SourceCode/FFmpeg/ffmpeg_install/
#ADDI_CFLAGS="-marm"
ADDI_CFLAGS="-mfpu=neon -mfloat-abi=softfp"

function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--disable-shared \
--enable-static \
--disable-asm \
--disable-yasm \
--enable-gpl \
--enable-stripping \
--enable-runtime-cpudetect \
--enable-cross-compile \
--enable-version3 \
--enable-nonfree
--enable-libx265 \
--enable-w32threads \
--enable-hwaccels \
--enable-neon \
--enable-decoders \
--enable-devices \
--enable-encoders \
--enable-muxers \
--enable-encoder=rawvideo \
--enable-protocols \
--enable-protocol=file \
--enable-avfilter \
--enable-network \
--enable-avdevice \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG

【讨论】:

  • 您不需要显式启用大多数本机的内部 FFmpeg 组件,除非您使用广泛的禁用选项(例如 --disable-everything)手动禁用它们。此外,不建议使用--disable-asm 和/或--disable-yasm,除非您想要非常慢的编码。
  • 对于任何可能看到这一点的人都会想到 --enable-asm。请小心,因为它支持文本重定位,从 Marshmallow 开始在 Android 上被禁止。这是您必须承受的性能损失,因为 FFmpeg 无法解决任何问题:android.googlesource.com/platform/bionic/+/master/…
【解决方案2】:

避免使用--disable-everything 编译

它将禁用所有组件,包括协议支持。

如果你必须使用--disable-everything

您必须手动启用所需的组件,例如 --enable-protocols 或以零碎的方式启用,例如 --enable-protocol=file,pipe。然而,这很难正确地做到,因为用户经常忘记启用他们需要的东西。有关更多信息,请参阅./configure --help 的输出。

【讨论】:

    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多