FFmpeg exemple de code pour créer un fichier vidéo à partir d'images fixes JNI Android

Comment je modifie le code d'exemple FFMPEG suivant pour créer un fichier vidéo à partir d'images fixes que j'ai sur mon téléphone Android. J'utilise JNI pour invoquer ffmpeg.

JNIEXPORT void JNICALL videoEncodeExample((JNIEnv *pEnv, jobject pObj, jstring filename) { AVCodec *codec; AVCodecContext *c= NULL; int i, out_size, size, x, y, outbuf_size; FILE *f; AVFrame *picture; uint8_t *outbuf, *picture_buf; printf("Video encoding\n"); /* find the mpeg1 video encoder */ codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO); if (!codec) { fprintf(stderr, "codec not found\n"); exit(1); } c= avcodec_alloc_context(); picture= avcodec_alloc_frame(); /* put sample parameters */ c->bit_rate = 400000; /* resolution must be a multiple of two */ c->width = 352; c->height = 288; /* frames per second */ c->time_base= (AVRational){1,25}; c->gop_size = 10; /* emit one intra frame every ten frames */ c->max_b_frames=1; c->pix_fmt = PIX_FMT_YUV420P; /* open it */ if (avcodec_open(c, codec) < 0) { fprintf(stderr, "could not open codec\n"); exit(1); } f = fopen(filename, "wb"); if (!f) { fprintf(stderr, "could not open %s\n", filename); exit(1); } /* alloc image and output buffer */ outbuf_size = 100000; outbuf = malloc(outbuf_size); size = c->width * c->height; picture_buf = malloc((size * 3) / 2); /* size for YUV 420 */ picture->data[0] = picture_buf; picture->data[1] = picture->data[0] + size; picture->data[2] = picture->data[1] + size / 4; picture->linesize[0] = c->width; picture->linesize[1] = c->width / 2; picture->linesize[2] = c->width / 2; /* encode 1 second of video */ for(i=0;i<25;i++) { fflush(stdout); /* prepare a dummy image */ /* Y */ for(y=0;y<c->height;y++) { for(x=0;x<c->width;x++) { picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3; } } /* Cb and Cr */ for(y=0;y<c->height/2;y++) { for(x=0;x<c->width/2;x++) { picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2; picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5; } } /* encode the image */ out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture); printf("encoding frame %3d (size=%5d)\n", i, out_size); fwrite(outbuf, 1, out_size, f); } /* get the delayed frames */ for(; out_size; i++) { fflush(stdout); out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL); printf("write frame %3d (size=%5d)\n", i, out_size); fwrite(outbuf, 1, out_size, f); } /* add sequence end code to have a real mpeg file */ outbuf[0] = 0x00; outbuf[1] = 0x00; outbuf[2] = 0x01; outbuf[3] = 0xb7; fwrite(outbuf, 1, 4, f); fclose(f); free(picture_buf); free(outbuf); avcodec_close(c); av_free(c); av_free(picture); printf("\n"); } 

Merci et salut Anish

  • Ajouter android: nom = "quelque chose" à AndroidManifest.xml "application" tag de Cordova plugin.xml
  • Jouez à la playlist avec MediaPlayer
  • L'appel de la méthode native deux fois de la bibliothèque de tiers dans une activité entraîne la fermeture de l'application Android
  • Accepter par programme l'appel au Nougat
  • Comment combiner OnClickListener et OnTouchListener pour un ImageButton
  • Méthode supprimée, mais la méthode de remplacement nécessite une meilleure api
  • Création d'une disposition différente pour le téléphone Android et la tablette
  • Supprimer le préfixe d'URL de String (http: /, www, etc.)
  • Comment incorporer le fichier make existant avec Android NDK
  • Essayer de désélectionner une vue à l'aide de getChildAt ()
  • Quels sont les problèmes courants lors de la migration de ActionBarSherlock vers ActionBarCompat?
  • Est-il possible pour une application Android de désactiver temporairement "OK Google"?
  • 2 Solutions collect form web for “FFmpeg exemple de code pour créer un fichier vidéo à partir d'images fixes JNI Android”

    Dans votre exemple de code, l'image codée est fausse. Donc, je pense que ce que vous devriez faire, c'est de remplacer l'image fictive par les images réelles dans votre appareil Android et n'oubliez pas de convertir son format en YUV420.

    Dans votre code, vous utilisez le format d'image comme PIX_FMT_YUV420P. Vous devez convertir vos images en YUV420P car Android utilise le format d'image brute YUV420SP (PIX_FMT_NV21), vous devez encore faire une mise à l'échelle de vos images en utilisant la bibliothèque libswscale fournie dans ffmpeg. Peut-être de ma réponse vous aidera. vérifie ça. Conversion de YUV420SP en YUV420P

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.