2012-07-04 14 views
16

próbowałem dekodować wideo przy użyciu biblioteki FFmpeg z próbki przykładów dostępnych w internecie, i ustalić to z nowej wersji ffmpeg, Oto kod, który nazwałem mojego pliku klasy,Dekodowanie wideo za pomocą ffmpeg dla android

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

teraz w .c pliku znajduje się w JNI dir, napisałem ten kod,

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; 
} 

po kompilacji kodu uzyskać to w dzienniku,

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 shared 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 

Nie można zrozumieć, jaki jest dokładny problem? Tutaj SaveFrame funkcja służy to wygląda,

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); 
} 

w dzienniku nie dostałem żadnej Zaloguj które umieściłem w kodzie!

Proszę mi pomóc,

Dzięki

+1

https://groups.google.com/forum/?fromgroups#!topic/android-ndk/vQVOn1iyd9g – Android

+0

Możliwe, że twój plik binarny używał niektórych instrukcji, które nie są obsługiwane przez twoje urządzenie. Czy mógłbyś użyć 'objdump -d' w androidowym NDK i dowiedzieć się, co jest instrukcją pod adresem ** 2de90 ** twojego' libmylib.so'? –

+0

Powinieneś spróbować zawęzić lokalizację awarii. Spróbuj wyemitować pierwszy komunikat dziennika na wejściu funkcji C, aby sprawdzić, czy logowanie działa. Obecnie duże funkcje ffmpeg, takie jak 'av_register_all' i' av_open_input_file' muszą zostać przekazane, zanim zobaczysz swój pierwszy komunikat dziennika. – dronus

Odpowiedz

1

Patrząc na polecenie powoduje problem ...

$ rasm2 -a ramię -d 4ff0e92d stclcs 0, CR15, [R9, nr 316 ]!

stc instrukcja documentation.

szukają, może nie być możliwe do zrobienia, że ​​z przestrzeni użytkownika: Getting ILL_ILLOPC (illegal opcode) when trying to execute MRC or MCR instructions on Android

Wtedy jednak nie powinno to być naprawdę problem prawda? :)

Postaraj się po prostu wydrukować niektóre komunikaty rejestrowania w natywnej (lub przynajmniej zrobić przed av_register_all()), nie należy dodawać żadnych innych dodatkowych bibliotekę i sprawdź, czy masz na to prawo.

0

Myślę, że zbudowałeś FFmpeg z opcjami kompilatora nieodpowiednimi dla Androida.

Polecam postępować zgodnie z android-ffmpeg-tutorial, ma działający przykład dla FFmpeg na Androida. Zawiera również artykuł o budowaniu FFmpeg dla Androida.

Możesz również chcieć rzucić okiem na znacznie bardziej zaawansowany kod Androida za pomocą odtwarzacza FFmpeg AndroidFFmpeg, działa dobrze nawet w emulatorze Genymotion, testowałem. Szczegółowe instrukcje, jak budować, pracował z pudełka.

Twój kod używa przestarzałych wywołań FFmpeg, kod z powyższych linków został na ten temat zaktualizowany.