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

  • Android: Sqlite qui sauvegarde le réseau de chaînes?
  • Extraction de données du fichier CSV (table de fusion et solution de contournement kml)
  • LeftNavBar crée une barre noire au sommet de l'activité
  • Comment spécifier la version JDK dans Android Studio?
  • Android - la transition entre le mode paysage et le mode portrait rend l'intention de perdre des valeurs
  • Collage natif dans /system/lib/libart.so
  • Test "réel" du récepteur sms
  • Android: RecyclerView dans une ScrollView
  • Android Build - Emulator collé sur le logo de démarrage Android
  • Comment voir un tableau dans logcat pour Android
  • WebSockets pour Android dans l'application Phonegap avec le serveur et le client Node.js / Socket.IO
  • Obtenir l'icône de l'application dans Android
  • 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.