H264 视频文件如何缩放分辨率?
前几天在知识星球里面有位朋友请教问题:如何将 H264 视频缩放分辨率?
具体的问题详情如下:
将 800x600 的 H264 文件缩放成 400x300 的,大概的流程是先解码,得到 AVFrame 后对其做缩放操作,然后再编码,得到 AVPacket 后写入文件即可。
思路没错的话,就可以看看这位同学的写法了,截取部分代码:
大家一起来挑错,看看遇到问题一般解决思路是什么样的。
问题一
首先提问者一直在 av_parser_parse2 函数处报错。
遇到这种情况不要慌,必现的问题先断点一下看看输入参数是否正确。
IDE 的断点调试是常见操作了,工程师进阶必备。
我没有调试提问者的代码,但也怀疑输入参数 pkt 有异常,顺着代码往下看,果然在函数最末尾几行调用了 av_packet_free 方法。
一般通过 av_packet_alloc 去申请 AVPacket ,而 av_packet_free 就是直接释放并置 nullptr ,这样下次在执行 av_parser_parse2 方法肯定就挂了。
void av_packet_free(AVPacket **pkt)
{if (!pkt || !*pkt)return;av_packet_unref(*pkt);av_freep(pkt);
}
所以这里肯定有问题呀。
问题二
接着看其他问题,想要缩放分辨率,可是代码截图中并没有看到任何缩放的代码,直接将解码后的 AVFrame 送去编码就可以缩放吗?
我猜想,提问者应该在设置编码的 AVCodecContext 时就已经指定好了缩放后的分辨率 400x300 ,但送去编码的 AVFrame 还是 800x600 的,这样编码的结果会是缩放的吗?
经过试验证明,编码的视频确实是 400x300 的,但画面却是从 800x600 截取的一部分,并没有显示完全,所以这样是不能起到缩放效果的。
要缩放还是得用 FFmpeg 中 SwsContext 提供的方法。
// 初始化
swsCtx = sws_getContext(800,600,AV_PIX_FMT_YUV420P,400,300,AV_PIX_FMT_YUV420P,SWS_BILINEAR, nullptr, nullptr,nullptr);
// 缩放
sws_scale(swsCtx,decodeFrame->data,decodeFrame->linesize,0,decodeFrame->height,encodeFrame->data,encodeFrame->linesize);
将缩放后的 AVFrame 送去编码就可以得到正确的效果了。
问题三
再仔细看提问者的代码,有必要在解码 avcodec_receive_frame 之前调用 av_frame_make_writable 吗?
由于提问者的代码本身不对,其实也不用调用 av_frame_make_writable 的,正常的缩放应该要两个 AVFrame 的,解码的 AVFrame 不需要,反而编码的 AVFrame 需要保证可写。
以上就是关于这次提问的一些问题反馈了,我自己也实现了一个简单的 H264 视频文件缩放分辨率的例子,完整的代码就放在知识星球里了。
关于播放器实践的专栏,后续大部分进展都会放在知识星球里面了,尤其是源码会在星球内同步更新,当然也会挑一些干货在公众号同步。
目前 音视频开发进阶知识星球 还在让利中,非常低的价格就可以获得业内一线开发人员的答疑解惑。
与其在群里面提问石沉大海,不如来星球有问必答,而且这个价格还是管一年的哦,一年的时间可以说是相当划算了。
同时星球内非常欢迎大家提问,尤其是我不会的问题,我会去找业内好朋友请教,既回答了你的问题又帮助了我提高。
想要加入的可以通过扫如下二维码进星球哦,iPhone 用户如果不能访问小程序的话,也可以加我微信 ezglumes 拉你进星球。
一个音视频领域专业问答的小圈子!
加我微信 ezglumes 拉你入技术交流群
推荐阅读:
音视频开发工作经验分享 || 视频版
OpenGL ES 学习资源分享
开通专辑 | 细数那些年写过的技术文章专辑
Android NDK 免费视频在线学习!!!
你想要的音视频开发资料库来了
推荐几个堪称教科书级别的 Android 音视频入门项目
觉得不错,点个在看呗~
H264 视频文件如何缩放分辨率?相关推荐
- ffmpeg —— v4l2录制h264视频文件(边采集边转码)
相关文章: v4l2采集图像并转换格式 视频编码(yuv编码h264) 目标:使用v4l2采集摄像头图像数据,并实时编码成h264视频文件. 代码: #include <stdio.h> ...
- H264 视频文件 帧格式 传输封装等 杂碎
H264 视频文件 帧格式 传输封装等 杂碎 rfc3984 Standards Track [Page 2] RFC 3984 RTP Payload Format for H.264 Video ...
- FFmpeg 4.0.2编码YUV序列为H264视频文件
/****************************** 功能:编码YUV序列为h264视频文件 FFmpeg:4.0.2 ******************************/ #in ...
- windows使用ffmpeg将mp4文件转变成h264视频文件
我是直接使用ffmpeg的安装包,win10下 首先下载ffmpeg http://www.ffmpeg.org/download.htmlhttp://www.ffmpeg.org/download ...
- H.264(H264)视频文件的制作
一.准备工作 1.下载并安装优酷客户端 2.下载ffmpeg可执行文件,解压可用,不需要下载源码自己编译. ffmpeg可执行文件下载链接:http://download.csdn.net/detai ...
- Qt音视频开发05-保存视频文件(yuv/h264/mp4)
一.前言 和音频存储类似,视频的存储也对应三种格式,视频最原始的数据是yuv(音频对应pcm),视频压缩后的数据是h264(音频对应aac),由于很多播放器或者早期的播放器不支持直接播放h264文件, ...
- mp4v2再学习 -- H264视频编码成MP4文件
一.H264视频编码成MP4文件 参看:H264视频编码成MP4文件 参看:mp4v2在VS2010下的编译与在项目中的使用 最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下 ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...
- Python 调用 ffmpeg-python 模块实现对视频文件切片,转码为 m3u8 格式并修改分辨率
实操场景 Python将MP4文件转码为m3u8格式视频. 本实战环节用到的模块依旧是 ffmpeg-python . 首先通过 ffmpeg 命令完成转码工作. 第一步,将视频转码为 ts 格式 f ...
最新文章
- 3.数据类型,运算符,表达式
- 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)
- shell 死循环if判断_Shell的条件判断
- 小米8ios图标包下载_小米互传PC端抢先下载,免流量、高速互传,支持多设备共享...
- 郸城二高2021年高考成绩查询时间,河南高考最高分是谁,2021年河南高考状元名单分数学校...
- c++友元函数及运算符重载
- python的print怎么输出utf-8的编码_原创反转精度算法:小数的终极编码
- iOS 修改webView字体
- 商人的盈利方式非你所想
- android:screenOrientation属性
- VC中海量文件读写类设计与应用
- 正确地利用Netty建立连接池
- Linux中的atim、mtime、ctime
- selenium自动化测试之鼠标模拟操作
- 多个excel文件合并到一个文件中的多个sheet表中
- 亚马逊成功的四个关键因素
- Elasticsearch5.3 JAVA Demo 聚合查询
- Machine Learning读书会 面试算法讲座 创业活动 算法班 历届汇总
- JavaScript 函数 Call的使用
- 分布式+ARM:云和恩墨zData与华为TaiShan服务器完成兼容性认证测试
热门文章
- 从kenko入华经历一窥海外电商与中国市场的艰难磨合
- Office Online Server搭建(全网最详细)
- 本地vue-router模式设置为mode:‘history‘时,页面空白,无法加载
- vue-router 路由模式
- 神舟战神G8-CA7NP和g8ca7nt哪个好 有什么区别详细配置对比
- vertical-align 调整行内元素对齐
- 缓存穿透,缓存击穿,缓存雪崩详解及解决办法
- sortable vue 排序_Vue使用Sortable步骤详解
- mysql cascade的用法_MySql和Hibernate中关于cascade的用法
- CHROME新插件揭露推特用户对加密货币的偏见