FFmpeg解码裸H264数据

项目地址源码https://github.com/liluojun/PlayVideo

之前弄了下Android硬解H264https://blog.csdn.net/hjt505694246/article/details/105046233,但是硬解多少还是受到硬件影响所有再折腾下ffmpeg软解。

关于ffmpeg解码的文章很多我也是业余接触下并且我对C语言也是个初学者,有不足的地方还请见谅。

先上代码

先初始化解码器

int FFmpegEncode::creatFFmpeg(AVCodecID id) {

avcodec_register_all();

mAVCodec = avcodec_find_decoder(id);

if (mAVCodec == NULL) {

printf("mAVCodec==NULL\n");

return -1;

}

mAVCodecContext = avcodec_alloc_context3(mAVCodec);

if (mAVCodecContext == NULL) {

printf("mAVCodecContext==NULL\n");

return -1;

}

if (avcodec_open2(mAVCodecContext, mAVCodec, NULL) < 0) {

printf("avcodec_open2 error\n");

return -1;

}

mAVFrame = av_frame_alloc();

if (!mAVFrame) {

printf("av_frame_alloc error\n");

return -1;

}

mAVPacket = av_packet_alloc();

if (!mAVPacket) {

printf("av_packet_alloc error\n");

return -1;

}

av_init_packet(mAVPacket);

return 0;

}

设置解码参数:宽高、帧率、数据类型

int FFmpegEncode::initAVCodecContext(int width, int heigth, int fps, AVPixelFormat pixFmt) {

if (mAVCodecContext == NULL) {

printf("initAVCodecContext NULL\n");

return -1;

}

if (width <= 0 || heigth <= 0 || fps <= 10) {

printf("initAVCodecContext Parameters of the abnormal\n");

return -1;

}

mAVCodecContext->width = width;

mAVCodecContext->height = heigth;

mAVCodecContext->frame_bits = fps;

mAVCodecContext->pix_fmt = pixFmt;

return 0;

}

喂数据解码:framedata是源数据,*outputY,*outputU,*outputV是解码后的yuv三个分量数据,pixfmt数据类型。

这里我有个拷贝的动作,据说有零拷贝的方式,有木有大佬知道的可以指点一下。

int FFmpegEncode::encodeFFmpeg(uint8_t *framedata, int framelen,//input

uint8_t *outputY, uint8_t *outputU, uint8_t *outputV, int *width,

int *height,

AVPixelFormat pixfmt) {

if (mAVPacket == NULL) {

printf("encodeFFmpeg NULL\n");

return -1;

}

mAVPacket->data = framedata;

mAVPacket->size = framelen;

while (mAVPacket->size > 0) {

if (avcodec_send_packet(mAVCodecContext, mAVPacket)) {

printf("%s %d avcodec_send_packet fail\n", __func__, __LINE__);

return -2;

}

if (avcodec_receive_frame(mAVCodecContext, mAVFrame)) {

printf("%s %d avcodec_receive_frame fail\n", __func__, __LINE__);

return -3;

}

switch (mAVCodecContext->pix_fmt) {

case AV_PIX_FMT_YUV420P: {

memcpy(outputY, mAVFrame->data[0], *width * *height);

memcpy(outputU, mAVFrame->data[1], *width * *height / 4);

memcpy(outputV, mAVFrame->data[2], *width * *height / 4);

width = &(mAVCodecContext->width);

height = &(mAVCodecContext->height);

pixfmt = mAVCodecContext->pix_fmt;

break;

}

case AV_PIX_FMT_NV21: {

memcpy(outputY, mAVFrame->data[0], *width * *height);

memcpy(outputU, mAVFrame->data[1], *width * *height / 4);

memcpy(outputV, mAVFrame->data[2], *width * *height / 4);

width = &(mAVCodecContext->width);

height = &(mAVCodecContext->height);

pixfmt = mAVCodecContext->pix_fmt;

break;

}

default: {

printf("mAVCodecContext->pix_fmt Failure to identify\n");

return -4;

}

}

return 0;

}

}

释放解码器资源

void

FFmpegEncode::unEncode() {

avcodec_close(mAVCodecContext);

av_free(mAVCodecContext);

av_frame_free(&mAVFrame);

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容