热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

libx264libfdk_aac编码解码详解

首先升级用vs2015来编译开发windows下的程序,因为更好的兼容c99语法,不用改很多东西。libx264的编译:在ubuntu下的确非常容易,windows平台有点麻烦,需

首先升级用 vs2015 来编译开发 windows 下的程序,因为更好的兼容 c99 语法,不用改很多东西。

libx264 的编译:

在 ubuntu 下的确非常容易,windows 平台有点麻烦,需要用到 MYSY2 ,现在这些开源项目,有的都不提供 vs 的工程,哪怕提供个 cmake 也行啊。

找到一个老版本的 libx264 http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20091006-2245.tar.bz2 带有 vs 的工程。

http://yasm.tortall.net/  需要安装这个,汇编器,速度比较快吧。

使用 vs 2015 打开解决方案,libx264 编译成功 x264 测试程序不行。

有几个函数找不到 _x264_lookahead_init _x264_lookahead_is_empt _x264_lookahead_put_frame ....

添加 encoder\lookahead.c 到lib ,重新编译成功2个。

========== 全部重新生成: 成功 2 个,失败 0 个,跳过 0 个 ==========

1,RGB 转 YUV 

ffmpeg 方法

 1 read_jpeg(file_image, &video_width, &video_height, &image_buff);
 2 
 3 uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 };
 4 indata[0] = (uint8_t *)image_buff;
 5 int inlinesize[AV_NUM_DATA_POINTERS] = { 0 };
 6 inlinesize[0] = frame->width * 3;
 7 
 8 ret = sws_scale(sws_ctx, indata, inlinesize, 0, frame->height, frame->data, frame->linesize);
 9 
10 for (int j = 0; j <3; j++)
11 {
12     printf("j:%d linesize in:%d out:%d\n", j, inlinesize[j], frame->linesize[j]);
13 }

get_video_size: 480*272
file_image:img/image-00001.jpg
j:0 linesize in:1440 out:480
j:1 linesize in:0 out:256
j:2 linesize in:0 out:256

RGB 数据被转为 YUV 数组,那么怎么取出来呢?

 1 //方法1
 2 if (0 > x264_picture_alloc(&m_pic, m_param.i_csp, m_param.i_width, m_param.i_height*2))
 3 {
 4     printf("x264 [error]: malloc failed\n");
 5     return -1;
 6 }
 7 
 8 memcpy(m_pic.img.plane[0], frame->data[0], frame->linesize[0]*frame->height);
 9 m_pic.img.i_stride[0] = frame->linesize[0];
10 
11 memcpy(m_pic.img.plane[1], frame->data[1], frame->linesize[1]*frame->height/2);
12 m_pic.img.i_stride[1] = frame->linesize[1];
13 
14 memcpy(m_pic.img.plane[2], frame->data[2], frame->linesize[2]*frame->height/2);
15 m_pic.img.i_stride[2] = frame->linesize[2];
16 
17 //方法2
18 if (0 > x264_picture_alloc(&m_pic, m_param.i_csp, m_param.i_width, m_param.i_height))
19 {
20     printf("x264 [error]: malloc failed\n");
21     return -1;
22 }
23 sws_scale(sws_ctx, indata, inlinesize, 0, frame->height, m_pic.img.plane, m_pic.img.i_stride);

有2种方法,如果手动 memcpy 则需要将图片内存申请的大一些,因为有对齐的问题,如果用 ffmpeg 传入 m_pic.img.plane, m_pic.img.i_stride 就不需要,ffmpeg 内部应该是做了 realloc。

参考 example.c 编写测试程序,x264_encoder_encode() i_nal 一直为 0。所以重新编译了静态库,方便调试。

#x264-master# ./configure --prefix=/usr --disable-asm --enable-static --enable-shared --enable-debug

编译测试程序 :g++ encode_video.cpp -lavcodec -lavutil -lswscale -lswresample -lavformat -ljpeg libx264.a -lpthread -ldl

x264_encoder_encode() 返回一直为0的问题,调了好几个小时,想了各种方法,改了各种参数,都没有效果,最后终于找到问题了,原来是测试的 YUV 数据太少。

 jpg 图片转的 YUV 用了40帧后才出现编码数据。

 1 x264 [debug]: frame=   0 QP=19.71 NAL=3 Slice:I Poc:0   I:396  P:0    SKIP:0    size=9052 bytes
 2 frame_size:9052
 3 file_image:img//image-00042.jpg
 4 Send frame 41
 5 x264 [debug]: frame=   1 QP=20.29 NAL=2 Slice:P Poc:2   I:6    P:140  SKIP:250  size=836 bytes
 6 frame_size:836
 7 file_image:img//image-00043.jpg
 8 Send frame 42
 9 x264 [debug]: frame=   2 QP=19.75 NAL=2 Slice:P Poc:4   I:0    P:43   SKIP:353  size=132 bytes
10 frame_size:132

参数设置,每10帧产生一个 关键 I 帧 ,同时禁用了 B 帧,因为我们要做 live 直播,去掉了。

m_param.i_frame_reference = 10;
m_param.i_bframe = 0;

libx264 libfdk_aac 编码 解码 详解


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
author-avatar
AD518最丶设计
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有