FFmpeg在安卓Java中无法使用单引号和双引号。

3
首先,我想在Android上为MP4文件实现一个速度计。经过一些研究,似乎最好的方法是使用FFmpeg。我决定使用这个库:https://github.com/WritingMinds/ffmpeg-android-java。它为Android实现了FFmpeg。将其包含到我的项目中非常简单。(说明:http://writingminds.github.io/ffmpeg-android-java/)
我使用以下方法。作为cmd,我使用带引号的字符串。
    ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
    ...
    };

现在我正在尝试在MP4文件上叠加一些动态文本。 我想我会从时间戳开始尝试。 时间戳需要像这样:... timecode='02:36:17\;00' ...
我的问题是,我得到了这个错误“无法找到适合的输出格式''。 无论我尝试使用“\”(转义)还是尝试使用常规引号,都无所谓。 每当我使用某种引号时,我都会收到一个错误。 这使得使用动态时间戳变得不可能。 我认为。
有人有想法如何解决这个问题吗? 请记住,时间码在Android(Java)类中的字符串中。
提前感谢您的帮助
编辑:
有人能提供一个有效的命令吗? cmd 1-3可以工作,但是4和5不起作用(即使作为String[])。
    String cmd1 = "-i /storage/emulated/0/dir1/dir2/TestVideo.MP4 -i /storage/emulated/0/dir1/dir2/logo.png -preset ultrafast -filter_complex overlay=10:main_h-overlay_h-10 -acodec: copy /storage/emulated/0/dir1/dir2/LogoOverlay1.mp4";// working PNG overlay

    String cmd2 = "-i /storage/emulated/0/dir1/dir2/TestVideo.MP4 -i /storage/emulated/0/dir1/dir2/logo.png -preset ultrafast -filter_complex overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 -acodec: copy /storage/emulated/0/dir1/dir2/LogoOverlay2.mp4";// working PNG overlay

    String cmd3 = "-i /storage/emulated/0/dir1/dir2/TestVideo.MP4 -i /storage/emulated/0/dir1/dir2/logo.png -preset ultrafast -filter_complex [0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map 0:a -acodec: copy /storage/emulated/0/dir1/dir2/LogoOverlay3.mp4";// working PNG overlay

    String cmd4 = "-i /storage/emulated/0/dir1/dir2/TestVideo2.MP4 -vf drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf: text=\'Stack Overflow\': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2\"  -acodec: copy /storage/emulated/0/dir1/dir2/TextOverlay.mp4";

    String cmd5 = "-i /storage/emulated/0/dir1/dir2/TestVideo2.MP4 -vf \'transpose=1\' /storage/emulated/0/dir1/dir2/rotated.mp4"; //rotate video

    String[] cmd4arr = new String[]{"-i", "/storage/emulated/0/dir1/dir2/TestVideo.MP4", "-vf", "drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf: text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2", "-acodec:", "copy /storage/emulated/0/dir1/dir2/TextOverlay.mp4"};

    String[] cmd5arr = new String[]{"-i", "/storage/emulated/0/dir1/dir2/TestVideo2.MP4","-preset","ultrafast", "-vf", "\'transpose=1\'", "/storage/emulated/0/dir1/dir2/rotated.mp4"};


    String[] cmd4ArrAlt = new String[]{"-i", "/storage/extSdCard/DCIM/Camera/Test.MP4", "-vf", "drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf:", "text=\'Stack Overflow\':", "fontcolor=white:", "fontsize=24:", "box=1:", "boxcolor=black:", "x=(w-text_w)/2:", "y=(h-text_h-line_h)/2", "-acodec:", "copy", "/storage/emulated/0/dir/TextOverlay.mp4"};

cmd4arr 生成以下日志:

    .../MainActivity﹕ onProgress ffmpeg version n2.4.2 Copyright (c) 2000-2014 the FFmpeg developers
    .../MainActivity﹕ onProgress   built on Oct  7 2014 15:08:46 with gcc 4.8 (GCC)
    .../MainActivity﹕ onProgress   configuration: --target-os=linux --cross-prefix=/home/sb/Source-Code/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/sb/Source-Code/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/sb/Source-Code/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/sb/Source-Code/ffmpeg-android/build/armeabi-v7a-neon --extra-cflags='-I/home/sb/Source-Code/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all -mfpu=neon' --extra-ldflags='-L/home/sb/Source-Code/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
    .../MainActivity﹕ onProgress   libavutil      54.  7.100 / 54.  7.100
    .../MainActivity﹕ onProgress   libavcodec     56.  1.100 / 56.  1.100
    .../MainActivity﹕ onProgress   libavformat    56.  4.101 / 56.  4.101
    .../MainActivity﹕ onProgress   libavdevice    56.  0.100 / 56.  0.100
    .../MainActivity﹕ onProgress   libavfilter     5.  1.100 /  5.  1.100
    .../MainActivity﹕ onProgress   libswscale      3.  0.100 /  3.  0.100
    .../MainActivity﹕ onProgress   libswresample   1.  1.100 /  1.  1.100
    .../MainActivity﹕ onProgress   libpostproc    53.  0.100 / 53.  0.100
    .../MainActivity﹕ onProgress Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/dir1/dir2/TestVideo2.MP4':
    .../MainActivity﹕ onProgress   Metadata:
    .../MainActivity﹕ onProgress     major_brand     : isom
    .../MainActivity﹕ onProgress     minor_version   : 512
    .../MainActivity﹕ onProgress     compatible_brands: isomiso2mp41
    .../MainActivity﹕ onProgress     creation_time   : 1970-01-01 00:00:00
    .../MainActivity﹕ onProgress     encoder         : Lavf53.24.2
    .../MainActivity﹕ onProgress   Duration: 00:00:06.40, start: 0.000000, bitrate: 1321 kb/s
    .../MainActivity﹕ onProgress     Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 640x368 [SAR 1:1 DAR 40:23], 932 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
    .../MainActivity﹕ onProgress     Metadata:
    .../MainActivity﹕ onProgress       creation_time   : 1970-01-01 00:00:00
    .../MainActivity﹕ onProgress       handler_name    : VideoHandler
    .../MainActivity﹕ onProgress     Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
    .../MainActivity﹕ onProgress     Metadata:
    .../MainActivity﹕ onProgress       creation_time   : 1970-01-01 00:00:00
    .../MainActivity﹕ onProgress       handler_name    : SoundHandler

cmd4ArrAlt会生成以下日志:

    .
    .
    .
    /MainA: onProgress:       handler_name    : SoundHandle
    /MainA: onProgress: [NULL @ 0xb5ec4a00] Unable to find a suitable output format for 'text='Stack Overflow':'
    /MainA: onProgress: text='Stack Overflow':: Invalid argument

cmd4arr和cmd5arr会创建一个新的MP4文件,但是它的大小为0KB。这两个命令似乎根本没有处理帧。它总是在上面发布的日志的最后一行停止。

编辑:

回答问题:"如何使用String []来使用此库?相关信息可能会解决其他问题。"

答案:我之前已将该项目作为“arr”导入。当它作为常规库导入时,您不能再使用普通的String,但它被实现为String[]。


请发布您要实现的FFmpeg命令。 - Gueorgui Obregon
一个不起作用的命令示例是:ffmpeg -i input.mp4 -vf drawtext="fontfile=/usr/share/fonts/TTF/Vera.ttf: text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2" -codec:a copy output.flv 它在 text='Stack Overflow' 处给我报错。我可以提供更多的示例,但我认为这是最基本的一个(它来自于 [https://dev59.com/FmMm5IYBdhLWcg3wbug1])。 - MalusDarkb
我尝试使用Stringarray,但FFmpeg命令似乎不能正常工作。你能告诉我它有什么问题吗? String[] complexCommand = {"ffmpeg", "-y" ,"-i", "/storage/emulated/0/dir1/dir2/input.MP4", "-strict","experimental", "-vf", "drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf: text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2", "-acodec:","copy", "/storage/emulated/0/dir1/dir2/overput.mp4"}; - MalusDarkb
1
这个库对我有用,我测试了至少10个命令,直到达成我的目标...我的意思是说,为了让命令生效,我必须转义单引号...所以数组元素:"drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf: text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2" ...应该是 "drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf: text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2"。 - Gueorgui Obregon
嗨,我编辑了我的关于cmd5的答案... - Gueorgui Obregon
显示剩余4条评论
1个回答

1

我遇到了同样的问题,问题出在复杂的 ffmpeg 命令上,最好将其作为数组而不是简单字符串传递给 android-ffmpeg-java 封装。

编辑:

尝试这个:

String[] cmd4arr = new String[]{
            "-i", 
            "/storage/emulated/0/dir1/dir2/TestVideo.MP4", 
            "-vf", 
            "drawtext=fontfile=/usr/share/fonts/TTF/Vera.ttf: text=\'Stack Overflow\': fontcolor=white: fontsize=24: box=1: boxcolor=black: x=(w-text_w)/2: y=(h-text_h-line_h)/2", 
            "-acodec:", 
            "copy",
            "/storage/emulated/0/dir1/dir2/TextOverlay.mp4"};

在cmd5中更改转置应该在等号=之前加上单引号,就像这样 "transpose=\'1\'"

 String[] cmd5arr = new String[]{"-i", 
            "/storage/emulated/0/dir1/dir2/TestVideo2.MP4",
            "-preset",
            "ultrafast", 
            "-vf", 
            "transpose=\'1\'",
            "/storage/emulated/0/dir1/dir2/rotated.mp4"};

我确实尝试过,但我没有找到一种方法将一个string[]放入这个方法中:execute(String cmd, FFmpegExecuteResponseHandler ffmpegExecuteResponseHandler) throws FFmpegCommandAlreadyRunningException。你能给我一个例子吗,告诉我如何使用这个库来做到这一点。你可以选择使用另一个方法:execute(Map<String, String> environvenmentVars, String cmd, FFmpegExecuteResponseHandler ffmpegExecuteResponseHandler) throws FFmpegCommandAlreadyRunningException。但我仍然不知道如何在这个方法中成功地使用一个数组。 - MalusDarkb
1
谢谢你。如果你能提供给我代码,那对我来说将是非常有帮助的。而且很高兴看到我不是唯一遇到这个问题的人。 - MalusDarkb
看看这篇文章,http://stackoverflow.com/a/23708382/4848308。这就是应该调用ffmpeg命令的方式。 - Gueorgui Obregon
谢谢。 我今天早些时候编辑了问题,因此您有更多信息 :) - MalusDarkb
不行,还是同样的问题。如果我也将drawtext后面的所有空格分开会怎么样? - MalusDarkb
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接