视频转码和解码

一、开门见山

代码注释里对逻辑做了简单说明,多余的解释我就不说了,直接上代码:

// FFmpegDll.cpp: 定义控制台应用程序的入口点。
//#include "stdafx.h"extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
#include "libswresample/swresample.h"
}AVFormatContext    *fmt_ctx;//流队列中,视频流所在的位置
int video_index = -1;//视频解码上下文
AVCodecContext  *video_codec_ctx;//输出缓存大小
int video_out_buffer_size;//输出缓存
uint8_t *video_out_buffer;//转码后输出的视频帧(如yuv转rgb24)
AVFrame *video_out_frame = av_frame_alloc();//格式转换上下文
struct SwsContext *video_convert_ctx;//解码前数据包
AVPacket *packet = (AVPacket *)malloc(sizeof(AVPacket));//初始化FFmpeg
//@param *url 媒体地址(本地/网络地址)
int init_ffmpeg(char *url) {av_register_all();//注册组件avformat_network_init();//支持网络流fmt_ctx = avformat_alloc_context();//打开文件if (avformat_open_input(&fmt_ctx, url, NULL, NULL) != 0) {return -1;}//查找流信息if (avformat_find_stream_info(fmt_ctx, NULL) < 0){return -1;}//找到流队列中,视频流所在位置for (int i = 0; i < fmt_ctx->nb_streams; i++) {if (fmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){video_index = i;break;}}//视频流没有找到if (video_index == -1){return -1;}//查找解码器video_codec_ctx = fmt_ctx->streams[video_index]->codec;AVCodec    *video_codec = avcodec_find_decoder(video_codec_ctx->codec_id);//解码器没有找到if (video_codec == NULL){return -1;}//打开解码器if (avcodec_open2(video_codec_ctx, video_codec, NULL) < 0){return -1;}//计算输出缓存video_out_buffer_size = av_image_get_buffer_size(AV_PIX_FMT_RGB24,video_codec_ctx->width,video_codec_ctx->height,1);//输出缓存video_out_buffer = new uint8_t[video_out_buffer_size];//准备一些参数,在视频格式转换后,参数将被设置值av_image_fill_arrays(video_out_frame->data,//转换后的数据video_out_frame->linesize,video_out_buffer, //视频bufferAV_PIX_FMT_RGB24,//像素格式video_codec_ctx->width,video_codec_ctx->height,1);video_convert_ctx = sws_getContext(//图片格式转换上下文video_codec_ctx->width,video_codec_ctx->height,video_codec_ctx->pix_fmt,video_codec_ctx->width,video_codec_ctx->height,AV_PIX_FMT_RGB24,//转码为RGB像素SWS_BICUBIC,NULL, NULL, NULL);av_init_packet(packet);return 0;
}//读取一帧
int read_frame() {int ret = -1;//是否从packet中解出一帧,0为未解出int got_picture;//从packet中解出来的原始视频帧AVFrame *original_video_frame = av_frame_alloc();if (av_read_frame(fmt_ctx, packet) == 0) {if (packet->stream_index == video_index){//解码。输入为packet,输出为original_video_frameif (avcodec_decode_video2(video_codec_ctx, original_video_frame, &got_picture, packet) >= 0){if (got_picture){//图片格式转换(上面图片转换准备的参数,在这里使用)sws_scale(video_convert_ctx,//图片转码上下文(const uint8_t* const*)original_video_frame->data,//原始数据original_video_frame->linesize,//原始参数0,//转码开始游标,一般为0video_codec_ctx->height,//行数video_out_frame->data,//转码后的数据video_out_frame->linesize);ret = 1;}}}}av_free_packet(packet);av_free(original_video_frame);return ret;
}//获取视频缓存大小
int get_video_buffer_size() {return video_out_buffer_size;
}//获取视频帧
char *get_video_frame() {return (char *)video_out_buffer;
}//获取视频宽度
int get_video_width() {return video_codec_ctx->width;
}//获取视频高度
int get_video_height() {return video_codec_ctx->height;
}//释放资源
void release() {sws_freeContext(video_convert_ctx);av_free(video_out_frame);av_free(video_out_buffer);avcodec_close(video_codec_ctx);avformat_close_input(&fmt_ctx);
}int main()
{char url[] = "rtmp://live.hkstv.hk.lxdns.com/live/hks";int init_ret = init_ffmpeg(url);if (init_ret >= 0){while (read_frame() < 0)//读取一帧,直到读取到数据{printf("未读取到数据\n");}printf("高度:%d  宽度:%d  缓存大小:%d", get_video_height(), get_video_width(), get_video_buffer_size());printf("\n=================================\n");printf(get_video_frame());//打印出来,虽然打印出来的东西看不懂,但是证明已经获取到一帧的数据了}else{printf("初始化失败!");}getchar();return 0;
}

二、运行项目

1、右击c++项目,“重新生成”:

------------------------------------------------------

2、运行项目,如下图:

----------------------------------------------------------------------

如果出现上图所示结果,证明已经读取到了一帧视频,这一帧视频的宽高是480x288,占用大小为414720字节。

注意:如果在生成项目过程中,出现4996错误,是由于vs不建议使用一些库导致的错误,解决办法如下图:

---------------------------------------------------------------------------------

FFmpeg 从零开始开发简单的音视频播放器(四)相关推荐

  1. FFmpeg 从零开始开发简单的音视频播放器(一)

    背景:由于近期项目需求,要开发一个简单的RTMP音视频流播放器,在做了技术调研后,采用了开源的 FFmpeg技术.由于我是初次接触FFmpeg,开发过程中遇到了一些问题,在此,对开发和过程中遇到了一些 ...

  2. android音视频播放器开发百度云,Android 播放端 SDK

    1 概述 PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单.快捷的接口,帮助开发者在 Android ...

  3. 基于Qt、FFMpeg的音视频播放器设计一

    前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...

  4. Qt FFmpeg 音视频播放器

    使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频. 本demo环境为 qt5.12 vs2019-32位 .pro的qt工程 FFmpeg版本位3.4.8 vs2092-32位 本 ...

  5. QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...

  6. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...

  7. Android实战练习——简单的网络视频播放器

    项目目录 一.项目概述 二.开发环境 三.项目结构 四.运行演示 五.项目总结 六.源码获取 一.项目概述 本次项目实现了一个简单的网络视频播放器,调用的是高度自定义的视频框架jiaozivideop ...

  8. Linux系统的madplay、mplayer音视频播放器的制作

    Linux系统音视频播放器的制作 madplay和mplayer的安装环境 一.Linux系统录音播放源码的下载和移植 1.需要下载alsa-lib-1.2.6.tar.bz2(声音驱动的内核组件库) ...

  9. 基于electron的音视频播放器

    基于electron的音视频播放器 前言 选择做一个音视频播放器桌面应用程序原因 技术的选型 已经实现了的功能 音视频播放实现 右键菜单实现 总结 效果图 安装包下载: 最后如果大家觉得我这个音视频播 ...

最新文章

  1. 运行数据区②---堆
  2. libcurl上传文件
  3. win7焦点总是不停丢失的解决方法
  4. python培训价目表-Python培训一般要多少钱?
  5. linux实现开机自启动脚本
  6. javascript之this指向
  7. 简单使用MATLAB自带的遗传算法工具箱
  8. 项目管理十大知识领域之间的关系
  9. Tomcat开启APR运行模式,优化并发性能
  10. python读取日志匹配日志信息(二)
  11. 选择华为账号第三方登录,让你无法拒绝的3个理由
  12. 芝麻信用免押金成趋势 报告称租赁经济有望突破10万亿元
  13. Type B和Type A的区别
  14. 2022 IoTDB Summit:IoTDB PMC 曹高飞《Apache IoTDB 秒级扩容能力与存算分离实践》
  15. UEFI小结-Handle的来龙去脉
  16. ORA-12516错误的处理
  17. 华为v3鸿蒙系统_【华为鸿蒙系统下载】华为鸿蒙系统 v3.3.5 官方最新版-趣致软件园...
  18. 计算机教室论文,高校多媒体教室计算机维护措施
  19. 【Verilog基础】一文搞懂线性反馈移位寄存器(LFSR)
  20. c语言ip字符串转为数组,C语言 ip地址转换为单个数字

热门文章

  1. cubemx 读卡器_STM32CubeMX基于SD卡的FATFS文件系统测试
  2. 自动化专业毕业设计选题推荐
  3. 关于在wrod里如何重新排版网页复制内容
  4. java return用法总结
  5. JavaScript里面的return的用法
  6. 考研初试占比高,复试压力小院校合集~
  7. word2003具有语音识别功能
  8. bugfree配置和使用
  9. URL、URN与URI的区别与联系
  10. 《软件创新——冲破高技术营造的牢笼》好书推荐