前几天在知识星球里面有位朋友请教问题:如何将 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 视频文件如何缩放分辨率?相关推荐

  1. ffmpeg —— v4l2录制h264视频文件(边采集边转码)

    相关文章: v4l2采集图像并转换格式 视频编码(yuv编码h264) 目标:使用v4l2采集摄像头图像数据,并实时编码成h264视频文件. 代码: #include <stdio.h> ...

  2. H264 视频文件 帧格式 传输封装等 杂碎

    H264 视频文件 帧格式 传输封装等 杂碎 rfc3984 Standards Track [Page 2] RFC 3984 RTP Payload Format for H.264 Video ...

  3. FFmpeg 4.0.2编码YUV序列为H264视频文件

    /****************************** 功能:编码YUV序列为h264视频文件 FFmpeg:4.0.2 ******************************/ #in ...

  4. windows使用ffmpeg将mp4文件转变成h264视频文件

    我是直接使用ffmpeg的安装包,win10下 首先下载ffmpeg http://www.ffmpeg.org/download.htmlhttp://www.ffmpeg.org/download ...

  5. H.264(H264)视频文件的制作

    一.准备工作 1.下载并安装优酷客户端 2.下载ffmpeg可执行文件,解压可用,不需要下载源码自己编译. ffmpeg可执行文件下载链接:http://download.csdn.net/detai ...

  6. Qt音视频开发05-保存视频文件(yuv/h264/mp4)

    一.前言 和音频存储类似,视频的存储也对应三种格式,视频最原始的数据是yuv(音频对应pcm),视频压缩后的数据是h264(音频对应aac),由于很多播放器或者早期的播放器不支持直接播放h264文件, ...

  7. mp4v2再学习 -- H264视频编码成MP4文件

    一.H264视频编码成MP4文件 参看:H264视频编码成MP4文件 参看:mp4v2在VS2010下的编译与在项目中的使用 最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下 ...

  8. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...

  9. Python 调用 ffmpeg-python 模块实现对视频文件切片,转码为 m3u8 格式并修改分辨率

    实操场景 Python将MP4文件转码为m3u8格式视频. 本实战环节用到的模块依旧是 ffmpeg-python . 首先通过 ffmpeg 命令完成转码工作. 第一步,将视频转码为 ts 格式 f ...

最新文章

  1. 3.数据类型,运算符,表达式
  2. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)
  3. shell 死循环if判断_Shell的条件判断
  4. 小米8ios图标包下载_小米互传PC端抢先下载,免流量、高速互传,支持多设备共享...
  5. 郸城二高2021年高考成绩查询时间,河南高考最高分是谁,2021年河南高考状元名单分数学校...
  6. c++友元函数及运算符重载
  7. python的print怎么输出utf-8的编码_原创反转精度算法:小数的终极编码
  8. iOS 修改webView字体
  9. 商人的盈利方式非你所想
  10. android:screenOrientation属性
  11. VC中海量文件读写类设计与应用
  12. 正确地利用Netty建立连接池
  13. Linux中的atim、mtime、ctime
  14. selenium自动化测试之鼠标模拟操作
  15. 多个excel文件合并到一个文件中的多个sheet表中
  16. 亚马逊成功的四个关键因素
  17. Elasticsearch5.3 JAVA Demo 聚合查询
  18. Machine Learning读书会 面试算法讲座 创业活动 算法班 历届汇总
  19. JavaScript 函数 Call的使用
  20. 分布式+ARM:云和恩墨zData与华为TaiShan服务器完成兼容性认证测试

热门文章

  1. 从kenko入华经历一窥海外电商与中国市场的艰难磨合
  2. Office Online Server搭建(全网最详细)
  3. 本地vue-router模式设置为mode:‘history‘时,页面空白,无法加载
  4. vue-router 路由模式
  5. 神舟战神G8-CA7NP和g8ca7nt哪个好 有什么区别详细配置对比
  6. vertical-align 调整行内元素对齐
  7. 缓存穿透,缓存击穿,缓存雪崩详解及解决办法
  8. sortable vue 排序_Vue使用Sortable步骤详解
  9. mysql cascade的用法_MySql和Hibernate中关于cascade的用法
  10. CHROME新插件揭露推特用户对加密货币的偏见