当前位置:网站首页>FFmpeg compiles and installs on win10 (configure libx264)
FFmpeg compiles and installs on win10 (configure libx264)
2022-08-09 13:04:00 【Know 12】
背景
使用带h264的ffmpeg才是我们的最终目的!
一、先把x264搞定(包含环境)
https://blog.csdn.net/qq_37249793/article/details/115272864
二、Windows配置步骤
1.下载FFmpeg
官网(http://www.ffmpeg.org/)下载源码
2.配置环境
- 重命名C:/msys64/usr/bin/link.exe 为C:/msys64/usr/bin/link.bak, 避免和MSVC 的link.exe抵触
- 下载yasm(http://yasm.tortall.net/Download.html)改名为yasm.exe放在/usr/bin/中
- 把msys目录下的msys2_shell.cmd的
rem set MSYS2_PATH_TYPE=inherit
去掉rem可以继承vs的编译环境 - 打开[适用于 VS 2017 的 x64 本机工具命令提示],输入
msys2_shell.cmd -mingw64
- Check if the environment is set up:
which cl link yasm cpp
- 把编译好的x264和解压的FFmpeg放在msys/home中,在FFpeg下新建build.sh:
./configure --toolchain=msvc --target-os=win64 \
--arch=x86_64 \
--enable-shared \
--enable-small \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-encoders \
--disable-decoders \
--enable-decoder=h264 \
--enable-encoder=libx264 \
--enable-encoder=mjpeg \
--enable-encoder=mpeg4 \
--prefix=./build \
--enable-libx264 \
--extra-cflags="-I/home/x264/include" \
--extra-ldflags="-LIBPATH:/home/x264/lib"
The bottom two lines arex264对应目录
7. 输入命令sh build.sh
,如果保WARNING: using libx264 without pkg-config可以不用管
8. 接下来就是编译了:
make
make install
- 生成后,基本同上一篇部署,如果缺东西的话,Also put alldll(包括libx264的)都放在Windows\System32里就可以了
3.测试
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/imgutils.h"
#include "libswscale/swscale.h"
};
#include <afxwin.h>
#pragma warning(disable:4996)
using namespace std;
typedef struct
{
int startpos;
int endpos;
int len;
int code;
int startlen;
}FrameAna;
unsigned char m_outbuf[1024 * 1024];
typedef struct
{
uint8_t m_Head[4];
int m_len;
}FrameHead_t;
void Parser();
int main()
{
Parser();
return 0;
}
//mp4中获取yuv
void Parser()
{
AVFormatContext *pFormatCtx;
int videoindex;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVFrame *pFrame;
uint8_t *out_buffer;
AVPacket *packet;
int ret, got_picture;
struct SwsContext *img_convert_ctx;
char filepath[] = "000.mp4";//要解析的mp4文件
FILE *fp_h264 = NULL;
FrameAna m_FrameInfo[1024];
int m_FrameIndex = 0;
fopen_s(&fp_h264, "000.h264", "wb+");//MP4输出成.h264文件
/* 初始化一个AVFormatContext ,并打开文件 */
pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx, filepath, NULL, NULL);
/* 获取视频文件信息 */
avformat_find_stream_info(pFormatCtx, NULL);
/* Find the video's number */
videoindex = -1;
for (unsigned int i = 0; i < pFormatCtx->nb_streams; i++)
{
if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
{
videoindex = (int)i;
break;
}
if (videoindex == -1)
{
AfxMessageBox(L"can't find video,error!");
return;
}
}
/* 查找解码器 */
pCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
/* 打开解码器 */
avcodec_open2(pCodecCtx, pCodec, NULL);
pFrame = av_frame_alloc();
out_buffer = (uint8_t *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1));
packet = (AVPacket*)av_malloc(sizeof(AVPacket));
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
/* Get the stream parsing object */
unsigned char *h264_buf;
int h264_len;
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
int iNeedIFrame = 1;
int iDecoderCnt = 0;
while (av_read_frame(pFormatCtx, packet) >= 0)
{
/* Read a frame of compressed data */
if (packet->stream_index == videoindex)
{
/* 数据解码,可获取到YUV解码后数据 */
ret = avcodec_send_packet(pCodecCtx, packet);
if (ret < 0)
{
AfxMessageBox(L"Decoder one frame , Error !");
return;
}
got_picture = avcodec_receive_frame(pCodecCtx, pFrame);
if (0 == got_picture)
{
iDecoderCnt++;
if (nullptr != fp_h264)
{
fwrite(pFrame->data[0], 1, pFrame->width * pFrame->height, fp_h264);
fwrite(pFrame->data[1], 1, pFrame->width * pFrame->height / 4, fp_h264);
fwrite(pFrame->data[2], 1, pFrame->width * pFrame->height / 4, fp_h264);
printf("I'm editing");
//Called every frametojpg函数转换为jpg图像
}
}
}
av_packet_unref(packet);
}
/* flush decoder */
/*当av_read_frame()循环退出的时候,In fact, the decoder may also contain the remaining few frames of data.因此需要通过“flush_decoder”Output these frames of data.“flush_decoder”The function is simply called directlyavcodec_decode_video2()获得AVFrame,instead of passing it to the decoderAVPacket.*/
while (1)
{
got_picture = avcodec_receive_frame(pCodecCtx, pFrame);
if (0 != got_picture)
break;
iDecoderCnt++;
}
sws_freeContext(img_convert_ctx);
/* Release the stream parsing object */
av_bitstream_filter_close(h264bsfc);
/* Close the file and free memory */
fclose(fp_h264);
av_frame_free(&pFrame);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);
CString m_str;
m_str.Format(L"Get FrameCnt = %d Success !!\n", iDecoderCnt);
AfxMessageBox(m_str);
return;
}
边栏推荐
- 又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
- 问题来了:4GB物理内存的机器上申请8G内存能成功吗?
- Adalvo acquires its first branded product, Onsolis
- Blazor Server (9) from scratch -- modify Layout
- 1小时直播招募令:行业大咖干货分享,企业报名开启丨量子位·视点
- Recommend a free 50-hour AI computing platform
- 已解决IndentationError: unindent does not match any oute r indentation Level
- 听声辨物,这是AI视觉该干的???|ECCV 2022
- MySQL 原理与优化,Group By 优化 技巧
- Shell之常用小工具(sort、uniq、tr、cut)
猜你喜欢
阿里高工带来的20022最新面试总结太香了
Manchester city launch emotional intelligence scarf can be detected, give the fans
"Digital Economy Panorama White Paper" Special Analysis of Banking Industry Intelligent Marketing Application Released
一甲子,正青春,CCF创建六十周年庆典在苏州举行
8、IDEA提交代码出现: Fetch failed fatal: Could not read from remote repository
非科班AI小哥火了:他没有ML学位,却拿到DeepMind的offer
WPF implements a MessageBox message prompt box with a mask
Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
JS封装防抖(代码持续优化)
你没见过的《老友记》镜头,AI给补出来了|ECCV 2022
随机推荐
Two minutes recording can pass by second language!The volcano how to practice and become voice tone reproduction technology?
Win10 compiles the x264 library (there are also generated lib files)
GPT-3组合DALL·E,60秒内搞定游戏设定和原型动画!网友看后:这游戏想玩
金融业“限薪令”出台/ 软银出售过半阿里持仓/ DeepMind新实验室成立... 今日更多新鲜事在此...
专业人士使用的 11 种渗透测试工具
LeetCode_单调栈_中等_456.132 模式
报告:想学AI的学生数量已涨200%,老师都不够用了
用 API Factory 产品生成 API 文档
罗振宇折戟创业板/ B站回应HR称用户是Loser/ 腾讯罗技年内合推云游戏掌机...今日更多新鲜事在此...
Adalvo acquires its first branded product, Onsolis
你没见过的《老友记》镜头,AI给补出来了|ECCV 2022
防止数据冒用的方法
【Adobe Premiere Pro 2020】pr2020安装和基本操作【PR安装、新建项目流程、导入及管理素材项目文件、添加标记、创建出入点剪辑视频、快速剪接及自动音乐卡点的方法
Experiment record: the process of building a network
AI篮球裁判火了,走步算得特别准,就问哈登慌不慌
8、IDEA提交代码出现: Fetch failed fatal: Could not read from remote repository
问题来了:4GB物理内存的机器上申请8G内存能成功吗?
无需精子卵子子宫体外培育胚胎,Cell论文作者这番话让网友们炸了
[Interview high-frequency questions] Linked list high-frequency questions that can be gradually optimized
The latest interview summary in 20022 brought by Ali senior engineer is too fragrant