如何开发可在VideoView API中使用的264“编解码格式?

时间:2018-07-31 15:16:43

标签: android ffmpeg android-ndk

我有一个大问题。我有一个从live555.com下载的视频“ tc10.264”。我无法播放使用videoview,exoplayer和vitamio sdk的视频 在android上。 我知道视频是编解码器。它不是mp4,flv等容器。 后来,我在Windows控制台上通过“ ffplay -f h264 tc10.264”播放了视频。 ffmpeg向我展示了此规范。 h264(基准),yubj420p和25 fps。

好的,这个视频存在。 之后,我从ubuntu上的虚拟机中下载了ffmpeg。然后,我用x264构建(编译)ffmpeg,如下所示。

我的目录路径类似于ffmpeg> x264,我从x264文件夹中为ffmpeg编译了libx264.a。

注意:我的Android手机在架构上具有armeabi_v7a

有build_android_arm.sh脚本。

#!/bin/bash
echo starting building .... 
NDK=/home/lscodex/android-sdk/ndk-bundle
PLATFORM=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PREFIX=./android/arm

function build_one
{
  ./configure \
  --prefix=$PREFIX \
  --enable-static \
  --enable-pic \
  --host=arm-linux \
  --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  --sysroot=$PLATFORM

  make clean
  make
  make install
}

build_one

echo Android ARM builds finished....

之后,我有一个名为android的文件夹,其中包含lib,include和bin文件。因此,我编译了如下所示的脚本以在ffmpeg文件夹中实现共享文件夹(“ .so”)。 有build_android_armeabi_v7a.sh脚本

#!/bin/bash

echo Android starting armeabi_v7a
NDK=/home/lscodex/android-sdk/ndk-bundle
PLATFORM=$NDK/platforms/android-19/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armeabi_v7a
PREFIX=$(pwd)/android/$CPU

GENERAL="\
--enable-small \
--enable-cross-compile \
--extra-libs="-lgcc" \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--extra-cflags="-I../x264/android/arm/include" \
--extra-ldflags="-L../x264/android/arm/lib" "


MODULES="\
--enable-gpl \
--enable-libx264"

H264TEST="\
--enable-encoder=libx264 \
--enable-encoder=libx264rgb \
--enable-decoder=h264 \
--enable-muxer=h264 \
--enable-demuxer=h264 \
--enable-parser=h264"

function build_ARMv7
{
  ./configure \
  --target-os=android \
  --prefix=$PREFIX \
  ${GENERAL} \
  --sysroot=$PLATFORM \
  --enable-shared \
  ${H264TEST} \
  --disable-static \
  --extra-cflags="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300" \
  --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
  --enable-zlib \
  ${MODULES} \
  --disable-doc \
  --enable-neon

  make clean
  make
  make install
}


build_ARMv7
echo Android ARMv7-a builds finished

最后,我获得了另一个包含共享库的android文件夹。 我整合了android studio中的文件。我创建了CMakeLists.txt和cpp文件夹。 因此,我认为一切都正常。 此ndk代码可帮助我接收一段bugs_bunny.mp4视频。

extern "C"
JNIEXPORT jint JNICALL
Java_com_lscodex_just_videoplayertesting2_VideoProcessing_videoDuration(
        JNIEnv *env,
        jobject obj,
        jstring input) {


    AVFormatContext *pFormatCtx = NULL;

     if(avformat_open_input(&pFormatCtx,convertStringFileToChar(env,input),NULL,NULL)<0){
         throwException(env,"Could not open input file ");
         loge("Could not open input file ");
         return 0;
     }
     if (avformat_find_stream_info(pFormatCtx,NULL)<0){
         throwException(env,"Failed to retrieve input stream information");
         loge("Failed to retrieve input stream information");
         return 0;
     }

    logd("I reached it here :) ");


    int64_t duration = pFormatCtx->duration;
    avformat_close_input(&pFormatCtx);
    avformat_free_context(pFormatCtx);
    return (jint) (duration / AV_TIME_BASE);
}

至少对于mp4视频格式。 所以,我的问题是,如何在exoplayer或videoview api上通过ffmpeg运行 tc10.264 编解码器视频格式?

0 个答案:

没有答案