Как ffmpeg вызывает камеру NDK - PullRequest
0 голосов
/ 26 февраля 2019

В проекте ffmpeg есть файл android_camera.c.Я хочу вызвать камеру NDK через ffmpeg, вынуть данные YUV и записать их в файл.В настоящее время код блокирует функцию wait_for_image_format.

Blocking Code Location

android_camera.c

#include <stdio.h>
#include <math.h>
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libavutil/dict.h>

int main(int argc, char **argv) {
    int ret;
    AVFormatContext *fmtCtx = NULL;
    AVPacket pkt1, *pcaket = &pkt1;

    /*1、注册*/
    avcodec_register_all();
    avdevice_register_all();
    /*2、连接视频源*/
    AVInputFormat *inputFmt = av_find_input_format("android_camera");
    if (NULL != inputFmt) {
        printf("input device name:%s\n",inputFmt->name);
    } else {
        printf("Null point!\n");
    }
    #if 1
    AVDictionary *avdict = NULL;
    AVDictionaryEntry *t = av_dict_get(avdict, "video_size", NULL, AV_DICT_IGNORE_SUFFIX);
    printf("ok1\n");
    av_dict_set(&avdict, "video_size", "hd720", 0);
    av_dict_set_int(&avdict, "camera_index",1, 0);
    av_dict_set_int(&avdict, "input_queue_size",2, 0);
    printf("ok2\n");
    /*3、打开视频采集设备*/
    //ret = avformat_open_input(&fmtCtx, "video=/dev/video1", inputFmt, avdict);
    //ret = avformat_open_input(&fmtCtx, "android_camera", inputFmt, avdict);
    fmtCtx = avformat_alloc_context();
    if (NULL == fmtCtx) {
        printf("Open input device seccess!\n");
    }
    printf("ok3\n");
    //if (avformat_find_stream_info(fmtCtx, NULL) < 0) {
        //  printf("Could not find stream information\n");
        //}
    //printf("ok4\n");
    ret = avformat_open_input(&fmtCtx, NULL, inputFmt, &avdict);
    printf("ok4\n");
    av_dict_free(&avdict);

    #else
    fmtCtx = avformat_alloc_context();
    if(!fmtCtx)
    {
        printf("avformat_alloc_contest error\n");
        exit(1);
    }

    #endif
    printf("ok5\n");
    //ret = av_demuxer_open(fmtCtx);
    if(ret<0)
    {
        printf("av_demuxer_open error\n");
    }
    printf("ok6\n");
    /*4、读取一帧数据,编码依据摄像头类型而定,我使用的摄像头输出的是yuv422格式*/
    fmtCtx->flags &= (~0x4);
    av_read_frame(fmtCtx, pcaket);
    printf("ok7\n");
    //printf("packet size:%d\n",(pcaket->size));
    /*5、写入帧数据到文件*/
    FILE *fp = NULL;
    fp = fopen("out.yuv", "a+");
    if (NULL != fp) {
        //将数据写入文件
        fwrite(pcaket->data, 1, pcaket->size, fp);
    }
    //关闭文件
    fclose(fp);
    /*6、释放读取的帧数据*/
    av_free_packet(pcaket);
    /*7、关闭视频输入源*/
    avformat_close_input(&fmtCtx);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...