ffmpeg系列之两种视频解码方式
来源:互联网 发布:网络报警主机 编辑:程序博客网 时间:2024/06/05 03:23
方式一:
#include "myplayer.h"#include <QtWidgets/QApplication>#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")#pragma comment(lib,"avcodec.lib")extern "C"{#include <libavformat/avformat.h>}static double r2d(AVRational r){return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;}int main(int argc, char *argv[]){av_register_all();char *path = "test.mp4";AVFormatContext *ac = NULL;int re = avformat_open_input(&ac, path, 0, 0);if (re != 0){//打开文件失败char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf));printf("file %s open failed because of : %s", path, buf);getchar();return -1;}int totalSec = ac->duration / AV_TIME_BASE;printf("指定的视频文件有 %d分%d秒\n", totalSec / 60, totalSec % 60);int videoStream = 0;AVCodecContext *videoCtx = NULL;for (int i = 0; i < ac->nb_streams; i++){AVCodecContext *enc = ac->streams[i]->codec;if (enc->codec_type == AVMEDIA_TYPE_VIDEO){videoStream = i;videoCtx = enc;AVCodec *codec = avcodec_find_decoder(enc->codec_id);if (!codec){printf("无法解码此视频文件\n");return -1;}int err = avcodec_open2(enc, codec, NULL);if (err != 0){char buf[1024] = { 0 };av_strerror(err, buf, sizeof(buf));printf(buf);return -2;}printf("\n");printf("成功打开视频编码流\n");}}AVFrame *yuv = av_frame_alloc();for (;;){AVPacket pkt;re = av_read_frame(ac, &pkt);if (re != 0){break;}if (pkt.stream_index != videoStream){av_packet_unref(&pkt);continue;}int pts = pkt.pts * r2d(ac->streams[pkt.stream_index]->time_base) * 1000;//得到帧的毫秒值//=============================================================================int got_picture = 0;int re = avcodec_decode_video2(videoCtx,yuv,&got_picture,&pkt);if (got_picture){printf("[%d]___", re);}//=============================================================================printf("pts = %d 毫秒\n", pts);av_packet_unref(&pkt);}avformat_close_input(&ac);QApplication a(argc, argv);MyPlayer w;w.show();return a.exec();}
运行结果:
第二种方式:
#include "myplayer.h"#include <QtWidgets/QApplication>#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")#pragma comment(lib,"avcodec.lib")extern "C"{#include <libavformat/avformat.h>}static double r2d(AVRational r){return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;}int main(int argc, char *argv[]){av_register_all();char *path = "test.mp4";AVFormatContext *ac = NULL;int re = avformat_open_input(&ac, path, 0, 0);if (re != 0){//打开文件失败char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf));printf("file %s open failed because of : %s", path, buf);getchar();return -1;}int totalSec = ac->duration / AV_TIME_BASE;printf("指定的视频文件有 %d分%d秒\n", totalSec / 60, totalSec % 60);int videoStream = 0;AVCodecContext *videoCtx = NULL;for (int i = 0; i < ac->nb_streams; i++){AVCodecContext *enc = ac->streams[i]->codec;if (enc->codec_type == AVMEDIA_TYPE_VIDEO){videoStream = i;videoCtx = enc;AVCodec *codec = avcodec_find_decoder(enc->codec_id);if (!codec){printf("无法解码此视频文件\n");return -1;}int err = avcodec_open2(enc, codec, NULL);if (err != 0){char buf[1024] = { 0 };av_strerror(err, buf, sizeof(buf));printf(buf);return -2;}printf("\n");printf("成功打开视频编码流\n");}}AVFrame *yuv = av_frame_alloc();for (;;){AVPacket pkt;re = av_read_frame(ac, &pkt);if (re != 0){break;}if (pkt.stream_index != videoStream){av_packet_unref(&pkt);continue;}int pts = pkt.pts * r2d(ac->streams[pkt.stream_index]->time_base) * 1000;//得到帧的毫秒值//=============================================================================int re = avcodec_send_packet(videoCtx,&pkt);if (re != 0){av_packet_unref(&pkt);continue;}re = avcodec_receive_frame(videoCtx,yuv);if (re != 0){av_packet_unref(&pkt);continue;}printf("[D]___");//=============================================================================printf("pts = %d 毫秒\n", pts);av_packet_unref(&pkt);}avformat_close_input(&ac);QApplication a(argc, argv);MyPlayer w;w.show();return a.exec();}
运行结果:
阅读全文
0 0
- ffmpeg系列之两种视频解码方式
- FFMPEG 之视频解码
- NDK之FFmpeg视频解码
- FFmpeg 学习之 定时器解码两路视频并进行对比
- FFmpeg 学习之 定时器解码两路视频并进行对比<2>
- ffmpeg编解码之图片转视频
- ffmpeg系列之打开ffmpeg视频解码器
- Unity3D之两种方式播放视频
- ffmpeg解码音频的两种方式(一)av_parser_parse解析器
- ffmpeg解码音频的两种方式(二)根据同步字节解析音频帧
- FFmpeg - 视频解码过程
- ffmpeg视频解码分析
- FFmpeg解码音视频
- ffmpeg解码视频
- Qt+ffmpeg解码视频
- Qt + ffmpeg 视频解码
- FFmpeg -- 解码视频
- ffmpeg解码烂视频
- FOC控制基于电阻的电流采样方案比较
- tf.split (API r1.3)
- vue-router源码分析-整体流程
- 求n个数的最小公倍数
- win10快捷键
- ffmpeg系列之两种视频解码方式
- Python实现机器学习--实现多元线性回归
- 如何写出漂亮的React组件
- 条款04:确定对象被使用前已经先被初始化
- 1701 H2 11.10王建瑜 连续第六天
- Linux系统基础(十二)
- babyos2(2)—— load elf format kernel
- VUE实现一个分页组件
- Windows下文件无法删除解决方法