澳门银河网上官方赌场_老品牌值得信赖

ITKeyword,专注技术干货聚合推荐

注册 | 登录

Decoding Video using FFMpeg for android

itPublisher 分享于

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1073

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

推荐:android 用ndk编译ffmpeg

一,解压ffmpeg 二,替换libavformat(本来可以不用替换的,由于项目需要,修改了源码, 所以需要替换) 三,配置(可以上网查),配置编译ffmpeg哪些文件,用什

I tried to decode video using FFMpeg library from the sample examples available on internet, i figure it out with new version of ffmpeg, here is the code which I called from my class file,

   private static native int decodeVideo(String filename);
   decodeVideo(getString(R.string._sdcard_abc_3gp));

now in .c file located in JNI dir,I wrote this code,

 jint Java_ru_dzakhov_ffmpeg_test_MainActivity_decodeVideo(JNIEnv* env, jobject
javaThis,jstring filename) {   
  AVFormatContext *pFormatCtx;
  int             i, videoStream;
  AVCodecContext  *pCodecCtx;
  AVCodec         *pCodec;
  AVFrame         *pFrame;
  AVFrame         *pFrameRGB;
  AVPacket        packet;
  int             frameFinished;
  int             numBytes;
  uint8_t         *buffer;

  // Register all formats and codecs
  av_register_all();

  // Open video file

      const jbyte *str;
      str = (*env)->GetStringUTFChars(env, filename, NULL);

      if(av_open_input_file(&pFormatCtx, str, NULL, 0, NULL)!=0)
      {
          LOGI("Can't open file '%s'\n", str);
          return 1;
      }
      else
      {
          LOGI("File is opened\n");
          LOGI("File '%s', Codec %s",pFormatCtx->filename,pFormatCtx->iformat->name);
      }


  // Dump information about file onto standard error

  LOGI("dump_format");
  dump_format(pFormatCtx, 0, filename, 0);
  LOGI("dump_format DONE");
  // Find the first video stream
  videoStream=-1;
  for(i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO)
      //if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)
      {
          LOGI("videoStream:: %d",videoStream);
      videoStream=i;
      break;
    }
  if(videoStream==-1)
    return -1; // Didn't find a video stream

  // Get a pointer to the codec context for the video stream
  pCodecCtx=pFormatCtx->streams[videoStream]->codec;

  // Find the decoder for the video stream
  pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
  if(pCodec==NULL) {
    fprintf(stderr, "Unsupported codec!\n");
    LOGI("Unsupported codec!\n");
    return -1; // Codec not found
  }
  // Open codec
  if(avcodec_open(pCodecCtx, pCodec)<0){
      LOGI("Codec Opened!\n");
    return -1; // Could not open codec
  }
  // Allocate video frame
  pFrame=avcodec_alloc_frame();

  // Allocate an AVFrame structure
  pFrameRGB=avcodec_alloc_frame();
  if(pFrameRGB==NULL){

      LOGI("checking --->>> pFrameRGB==NULL\n");
    return -1;
  }
  // Determine required buffer size and allocate buffer

  LOGI("Determine required buffer size and allocate buffer\n");
  numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,
                              pCodecCtx->height);

  LOGI("numBytes %d",numBytes);

  buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

  // Assign appropriate parts of buffer to image planes in pFrameRGB
  // Note that pFrameRGB is an AVFrame, but AVFrame is a superset
  // of AVPicture
  avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,
                 pCodecCtx->width, pCodecCtx->height);

  // Read frames and save first five frames to disk
  i=0;
  while(av_read_frame(pFormatCtx, &packet)>=0) {
    // Is this a packet from the video stream?
    if(packet.stream_index==videoStream) {
      // Decode video frame
        avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished,&packet);
                           //packet.data, packet.size);

      // Did we get a video frame?
      if(frameFinished) {
        // Convert the image from its native format to RGB
        /*Temporarily down
         *
         * img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24,
                    (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width,pCodecCtx->height);*/

        // Save the frame to phone memory
          LOGI("Saving Frame\n");
         SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, ++i);
         LOGI("After Saving Frame\n");
      }
    }

    // Free the packet that was allocated by av_read_frame
    av_free_packet(&packet);
  }

  // Free the RGB image
  av_free(buffer);
  av_free(pFrameRGB);

  // Free the YUV frame
  av_free(pFrame);

  // Close the codec
  avcodec_close(pCodecCtx);

  // Close the video file
  av_close_input_file(pFormatCtx);

  return 0;
}

after compiling the code i get this in log,

07-04 10:58:38.961: D/dalvikvm(1010): Trying to load lib /data/data/ru.dzakhov.ffmpeg.test/lib/libmylib.so 0x4051e878
07-04 10:58:38.971: D/dalvikvm(1010): Added 
 d lib /data/data/ru.dzakhov.ffmpeg.test/lib/libmylib.so 0x4051e878 07-04 10:58:38.971: D/dalvikvm(1010): No JNI_OnLoad found in /data/data/ru.dzakhov.ffmpeg.test/lib/libmylib.so 0x4051e878, skipping init 07-04 10:58:39.011: I/System.out(1010): Creating Engine 07-04 10:58:39.011: I/mylib(1010): initiated 07-04 10:58:39.011: I/System.out(1010): Decoding Video 07-04 10:58:39.011: I/System.out(1010): passing video::/sdcard/NativeMedia.ts 07-04 10:58:39.101: W/dalvikvm(231): disableGcForExternalAlloc: false 07-04 10:58:39.121: I/DEBUG(71): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 07-04 10:58:39.121: I/DEBUG(71): Build fingerprint: 'htc_asia_india/htc_icong/icong:2.3.3/GRI40/68450.5:user/release-keys' 07-04 10:58:39.121: I/DEBUG(71): pid: 1010, tid: 1010 >>> ru.dzakhov.ffmpeg.test <<< 07-04 10:58:39.121: I/DEBUG(71): signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 8102de90 07-04 10:58:39.121: I/DEBUG(71): r0 0000ac28 r1 40521b98 r2 40526340 r3 42157cc8 07-04 10:58:39.121: I/DEBUG(71): r4 bee7d368 r5 00000004 r6 40521b98 r7 42157c88 07-04 10:58:39.121: I/DEBUG(71): r8 bee7d348 r9 42157c80 10 42157c6c fp 42f0f04c 07-04 10:58:39.121: I/DEBUG(71): ip 8102de91 sp bee7d348 lr 80018378 pc 8102de90 cpsr a0000030 07-04 10:58:39.121: I/DEBUG(71): d0 4140000041600000 d1 3ff0000041680000 07-04 10:58:39.121: I/DEBUG(71): d2 bf80000000000000 d3 0000000000000000 07-04 10:58:39.121: I/DEBUG(71): d4 0000000000000000 d5 3ff000003f800000 07-04 10:58:39.121: I/DEBUG(71): d6 bff000003f800000 d7 4160000000000000 07-04 10:58:39.121: I/DEBUG(71): d8 0000000000000000 d9 0000000000000000 07-04 10:58:39.121: I/DEBUG(71): d10 0000000000000000 d11 0000000000000000 07-04 10:58:39.121: I/DEBUG(71): d12 0000000000000000 d13 0000000000000000 07-04 10:58:39.121: I/DEBUG(71): d14 0000000000000000 d15 0000000000000000 07-04 10:58:39.121: I/DEBUG(71): scr 20000012 07-04 10:58:39.221: I/DEBUG(71): #00 pc 0002de90 /data/data/ru.dzakhov.ffmpeg.test/lib/libmylib.so 07-04 10:58:39.221: I/DEBUG(71): #01 pc 0004f13c /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #02 pc 0001d584 /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #03 pc 00022b8c /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #04 pc 00021a80 /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #05 pc 0006060a /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #06 pc 0006828e /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #07 pc 0001d584 /system/lib/libdvm.so 07-04 10:58:39.221: I/DEBUG(71): #08 pc 00022b8c /system/lib/libdvm.so 07-04 10:58:39.231: I/DEBUG(71): #09 pc 00021a80 /system/lib/libdvm.so 07-04 10:58:39.231: I/DEBUG(71): #10 pc 0006045c /system/lib/libdvm.so 07-04 10:58:39.231: I/DEBUG(71): #11 pc 0004c430 /system/lib/libdvm.so 07-04 10:58:39.231: I/DEBUG(71): #12 pc 00037638 /system/lib/libandroid_runtime.so 07-04 10:58:39.231: I/DEBUG(71): #13 pc 00038456 /system/lib/libandroid_runtime.so 07-04 10:58:39.231: I/DEBUG(71): #14 pc 00008ca2 /system/bin/app_process 07-04 10:58:39.231: I/DEBUG(71): #15 pc 00014f24 /system/lib/libc.so 07-04 10:58:39.231: I/DEBUG(71): code around pc: 07-04 10:58:39.231: I/DEBUG(71): 8102de70 003d9cd0 00000408 0029e598 0029e5de 07-04 10:58:39.231: I/DEBUG(71): 8102de80 0029e5d8 0029e5d8 0029e5cc 0029e5c8 07-04 10:58:39.231: I/DEBUG(71): 8102de90 4ff0e92d b0994604 f0004615 6823f945 07-04 10:58:39.231: I/DEBUG(71): 8102dea0 46294620 32a4f8d3 47982200 46044f81 07-04 10:58:39.231: I/DEBUG(71): 8102deb0 a8172300 22004621 9300447f f9c0f060 07-04 10:58:39.231: I/DEBUG(71): code around lr: 07-04 10:58:39.231: I/DEBUG(71): 80018358 3497c004 3488c004 3afffff9 e2888004 07-04 10:58:39.231: I/DEBUG(71): 80018368 eafffff9 e899000c e594c008 e12fff3c 07-04 10:58:39.231: I/DEBUG(71): 80018378 e3550000 1594c00c 188c0003 e914a3f0 07-04 10:58:39.231: I/DEBUG(71): 80018388 e1a05e22 e5946004 e3a02000 e4d6c001 07-04 10:58:39.231: I/DEBUG(71): 80018398 e35c0000 0a000007 e2822001 e35c0044 07-04 10:58:39.231: I/DEBUG(71): stack: 07-04 10:58:39.231: I/DEBUG(71): bee7d308 000001b4 07-04 10:58:39.231: I/DEBUG(71): bee7d30c c0000000 07-04 10:58:39.231: I/DEBUG(71): bee7d310 80018540 /system/lib/libdvm.so 07-04 10:58:39.231: I/DEBUG(71): bee7d314 0000cf98 07-04 10:58:39.231: I/DEBUG(71): bee7d318 42157c6c 07-04 10:58:39.231: I/DEBUG(71): bee7d31c afd139d9 /system/lib/libc.so 07-04 10:58:39.231: I/DEBUG(71): bee7d320 0002de91 07-04 10:58:39.241: I/DEBUG(71): bee7d324 0000000e 07-04 10:58:39.241: I/DEBUG(71): bee7d328 80018540 /system/lib/libdvm.so 07-04 10:58:39.241: I/DEBUG(71): bee7d32c 00000070 07-04 10:58:39.241: I/DEBUG(71): bee7d330 42157c6c 07-04 10:58:39.241: I/DEBUG(71): bee7d334 00238100 07-04 10:58:39.241: I/DEBUG(71): bee7d338 00000000 07-04 10:58:39.241: I/DEBUG(71): bee7d33c 00000000 07-04 10:58:39.241: I/DEBUG(71): bee7d340 df002777 07-04 10:58:39.241: I/DEBUG(71): bee7d344 e3a070ad 07-04 10:58:39.241: I/DEBUG(71): #00 bee7d348 423692b4 07-04 10:58:39.241: I/DEBUG(71): bee7d34c 0000cf98 07-04 10:58:39.241: I/DEBUG(71): bee7d350 40521b98 07-04 10:58:39.241: I/DEBUG(71): bee7d354 8102de91 /data/data/ru.dzakhov.ffmpeg.test/lib/libmylib.so 07-04 10:58:39.241: I/DEBUG(71): bee7d358 80018540 /system/lib/libdvm.so 07-04 10:58:39.241: I/DEBUG(71): bee7d35c 0000cf98 07-04 10:58:39.241: I/DEBUG(71): bee7d360 bee7d368 07-04 10:58:39.241: I/DEBUG(71): bee7d364 800499df /system/lib/libdvm.so 07-04 10:58:39.241: I/DEBUG(71): bee7d368 42157c80 07-04 10:58:39.241: I/DEBUG(71): bee7d36c 42d58795 07-04 10:58:39.241: I/DEBUG(71): bee7d370 8102de91 /data/data/ru.dzakhov.ffmpeg.test/lib/libmylib.so 07-04 10:58:39.241: I/DEBUG(71): bee7d374 bee7d418 07-04 10:58:39.241: I/DEBUG(71): bee7d378 00016de0 07-04 10:58:39.241: I/DEBUG(71): bee7d37c 0000ac28 07-04 10:58:39.241: I/DEBUG(71): bee7d380 00000001 07-04 10:58:39.241: I/DEBUG(71): bee7d384 bee7d418 07-04 10:58:39.241: I/DEBUG(71): bee7d388 42157c80 07-04 10:58:39.241: I/DEBUG(71): bee7d38c 40521b98 07-04 10:58:39.241: I/DEBUG(71): bee7d390 423692b4 07-04 10:58:39.241: I/DEBUG(71): bee7d394 800499a1 /system/lib/libdvm.so 07-04 10:58:39.241: I/DEBUG(71): bee7d398 42157c80 07-04 10:58:39.241: I/DEBUG(71): bee7d39c 8004f13f /system/lib/libdvm.so 07-04 10:58:39.241: I/DEBUG(71): #01 bee7d3a0 00000002 07-04 10:58:39.251: I/DEBUG(71): bee7d3a4 0000000e 07-04 10:58:39.251: I/DEBUG(71): bee7d3a8 bee7d418 07-04 10:58:39.251: I/DEBUG(71): bee7d3ac 0000cf98 07-04 10:58:39.251: I/DEBUG(71): bee7d3b0 400198b8 07-04 10:58:39.251: I/DEBUG(71): bee7d3b4 42d5861c 07-04 10:58:39.251: I/DEBUG(71): bee7d3b8 42157c98 07-04 10:58:39.251: I/DEBUG(71): bee7d3bc bee7d410 07-04 10:58:39.251: I/DEBUG(71): bee7d3c0 40521b98 07-04 10:58:39.251: I/DEBUG(71): bee7d3c4 8001d588 /system/lib/libdvm.so

Unable to understand what's exact problem is there? Here SaveFrame function is used it looks like,

void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) {
  FILE *pFile;
  char szFilename[32];
  int  y;

  // Open file
  LOGI("Opening file!");
  sprintf(szFilename, "frame%d.ppm", iFrame);

  pFile=fopen(szFilename, "wb");
  if(pFile==NULL)
    return;

  // Write header
  fprintf(pFile, "P6\n%d %d\n255\n", width, height);
  //LOGI("width::"+width+"Height::"+height);
  // Write pixel data
  for(y=0; y<height; y++){
      LOGI("writing file");
    fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);
  }
  // Close file
  fclose(pFile);
}

in log I didn't get any Log which i placed in the code!

Please help me out,

Thanks

android video android-ndk ffmpeg decode
|
  this question
edited Aug 15 '12 at 0:35 Austyn Mahoney 7,836 6 41 78 asked Jul 4 '12 at 5:35 Rahul Upadhyay 1,593 2 11 27 1   groups.google.com/forum/?fromgroups#!topic/android-ndk/… –  Android Jul 4 '12 at 6:15      It's possible that your binary used some instructions not supported by your device. Would you please use objdump -d in the android NDK, and find out what's the instruction at address 2de90 of your libmylib.so? –  Henry Hu Aug 10 '12 at 16:14      You should try to narrow down the crash location. Try to emit the first log message on the entry of your C function, to see if logging works. Currently, large ffmpeg functions like av_register_all and av_open_input_file must be passed before you see your first log message. –  dronus Aug 16 '12 at 14:32      Hi @drnous, I tried it before but got no result for that. :( –  Rahul Upadhyay Aug 18 '12 at 4:13 1   Or you could use some precompiled package that is known to work, such as the one that comes with JavaCV... –  Samuel Audet Aug 20 '12 at 8:22

 | 

2 Answers
2

Looking at the instruction causing problem...

$ rasm2 -a arm -d 4ff0e92d stclcs 0, cr15, [r9, #316]!

stc instruction documentation.

推荐:FFMpeg & x264 compile for using with Android NDK on Mac OSX

1.?Toolchain?for?compile?(This?NDK?version?is?r8) a.?Android’s?NDK?allows?we?to?create?toolchain?installation?using?“make-standalone-toolchain.sh”?

Searching for it, it might not be possible to do that from user space: Getting ILL_ILLOPC (illegal opcode) when trying to execute MRC or MCR instructions on Android

Then however this shouldn't be really your problem right? :)

Try to just print some logging messages in native (or at least do that before av_register_all()), don't add any other extra library, and see if you get that right.


|
  this answer
answered Aug 22 '12 at 15:03 auselen 19.8k 3 46 78

 | 

I think you built FFmpeg with compiler options not suitable for Android.

I would recommend to follow android-ffmpeg-tutorial, it has working example for FFmpeg on Android. It has reference to article about building FFmpeg for Android as well.

You also may want to have a look at much more advanced Android code with FFmpeg player AndroidFFmpeg, it works OK even in Genymotion emulator, I tested. Detailed instructions how to build, worked from the box.

Your code uses deprecated FFmpeg calls, code from the links above was updated for that matter.


|
  this answer
answered Nov 29 '14 at 21:15 Mixaz 1,597 14 26

 | 

推荐:2012.08.24——— android ndk 编译ffmpeg

2012.08.24——— android ndk 编译ffmpeg 参考: http://www.cnblogs.com/shaobin0604/archive/2011/08/05/2128619.html http://www.jouhu.com/blog/p=465 1、


相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。

澳门银河网上官方赌场 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>