精华内容
下载资源
问答
  • c++ ffmpeg
    千次阅读
    2020-08-31 13:58:36

    实现视频播放并不难,关键就是两个函数sws_getContext和sws_scale的使用,直接上代码:

    int Grial(int a, int b)
    {
    	if(b == 0) return a;
    	return Grial(b, a%b);
    }
    
    void PlayVideo(const string& strVideoPath)
    {
    av_register_all();
    AVFormatContext* avFormatContext = avformat_alloc_context();
    int ret = avformat_open_input(&avFormatContext, strVideoPath.c_str(), NULL, NULL);//读取文件头
    if (ret != 0)
    	return;
    ret = avformat_find_stream_info(avFormatContext, NULL);
    if (ret < 0)
    	return;
    int videoStream_index = -1;//视频流索引号
    for (int i = 0; i < avFormatContext->nb_streams; i++)
    {
    	if (avFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){
    		videoStream_index = i;
    		break;
    	}
    }
    if (videoStream_index == -1)
    	return;
    AVCodecContext* videoCodecContext = avFormatContext->streams[videoStream_index]->codec;
    AVCodec* videoCodec = avcodec_find_decoder(videoCodecContext->codec_id);//通过上下文查找编码器
    if (videoCodec == NULL){
    	printf("Couldn't get AVCodec\n");
    	return;
    }
    if (avcodec_open2(videoCodecContext, videoCodec, NULL) < 0){// 打开编码器
    	printf("Couldn't open AVCodec\n");
    	return;
    }
    AVPacket *avPacket = (AVPacket*)av_malloc(sizeof(AVPacket));//分配avPacket
    AVFrame *videoFrame = av_frame_alloc();//分配视频帧
    int64_t start_time = av_gettime_relative();
    while (av_read_frame(avFormatContext, avPacket) >= 0)
    {
    	if (avPacket->stream_index == videoStream_index)
    	{
    		int got_picture_ptr = 0;//是否被解码成功解码的标识(0标识失败,非0表示成功)
    		avcodec_decode_video2(videoCodecContext, videoFrame, &got_picture_ptr, avPacket);//解码视频帧
    		if (0 != got_picture_ptr)
    		{
    			RECT rt = video_ctrl_screen_->GetPos();
    			int item_h = rt.bottom - rt.top;
    			int item_w = rt.right - rt.left;
    			int nGrial = Grial(videoCodecContext->width, videoCodecContext->height);//利用辗转相除法,计算得到最大公约数
    			int nW = videoCodecContext->width / nGrial;
    			int nH = videoCodecContext->height / nGrial;
    
    			int nZearoWidth = 100;
    			int nZearoHeight = nZearoWidth * nH / nW;
    			int nWidthTemp = (item_w - nZearoWidth) / 4;
    			int nHeightTemp = (item_h - nZearoHeight) / (4 * nH / nW);
    			int nMin = min(nWidthTemp, nHeightTemp);
    			int nOutWidth = nZearoWidth + nMin * 4;
    			int nOutHeight = nZearoHeight + nMin *  (4 * nH / nW);
    
    			AVFrame* pFrameRGB = av_frame_alloc();
    			int numBytes = avpicture_get_size(AV_PIX_FMT_BGR24, nOutWidth, nOutHeight);
    			uint8_t* buffer = new(std::nothrow) uint8_t[numBytes];
    			avpicture_fill((AVPicture *)pFrameRGB, buffer, AV_PIX_FMT_BGR24, nOutWidth, nOutHeight);
    			SwsContext *pSWSCtx = sws_getContext(videoCodecContext->width, videoCodecContext->height, \
    				videoCodecContext->pix_fmt, nOutWidth, nOutHeight, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
    
    			sws_scale(pSWSCtx, videoFrame->data, videoFrame->linesize, 0, videoFrame->height, pFrameRGB->data, pFrameRGB->linesize);
    			if (video_ctrl_screen_)
    				video_ctrl_screen_->Refresh(nOutWidth, nOutHeight, (unsigned char*)pFrameRGB->data[0], nOutWidth * nOutHeight * AV_PIX_FMT_BGR24);
    
    			//对视频流进行同步
    			AVRational time_base = avFormatContext->streams[videoStream_index]->time_base;
    			AVRational time_base_q = { 1, AV_TIME_BASE };
    			int64_t pts_time = av_rescale_q(avPacket->pts, time_base, time_base_q);
    			int64_t now_time = av_gettime_relative() - start_time;
    			if (pts_time > now_time)
    				av_usleep(pts_time - now_time);
    
    			delete[] buffer;
    			buffer = nullptr;
    			sws_freeContext(pSWSCtx);
    			av_frame_free(&pFrameRGB);
    		}
    	}
    	av_free_packet(avPacket);	
    }
    av_frame_free(&videoFrame);//释放videoFrame
    av_packet_free(&avPacket);//释放avPacket
    avcodec_close(videoCodecContext);//关闭视频解码器
    avformat_close_input(&avFormatContext);//关闭输入文件
    }

    sws_scale转换得到pFrameRGB->data数据即为RGB视频数据,nOutWidth, nOutHeight分别为显示的视频宽高,接下来就是通过转成BITMAPINFO显示到dc上即可。

    更多相关内容
  • C++ FFMpeg实例

    2019-10-15 10:26:00
    从摄像头URL地址采集,播放视频,方便学习FFMPEG的拉流,采集应用。
  • C++基于FFmpeg的音频解码和播放,使用VS2010编码,本程序实现了音频的解码和播放。可供学习和参考
  • C++封装的FFMPEG拉取音视频接口类,调用简单,采用回调方式取数据,工程采用VS2015,希望对需要的人有帮助!
  • C++ ffmpeg开发环境配置

    千次阅读 2020-02-28 13:09:32
    本篇记录ffmpeg C++开发环境配置,我的环境:win10-64 ,VS2015,FFmpeg_4.2.1_win64 需要ffmpeg 4.2.1 win64开发包的可以去【ffmpeg官网】下载,或者点击点击如下百度网盘链接下载. 链接:...

            本篇记录ffmpeg C++开发环境配置,我的环境:win10-64 ,VS2015,FFmpeg_4.2.1_win64

            需要ffmpeg 4.2.1 win64开发包的可以去【ffmpeg官网】下载,或者点击点击如下百度网盘链接下载.

                 链接:https://pan.baidu.com/s/1YXmkHoBp-JYMln7aSQrgsg
                 提取码:6go3

           用VS2015创建一个windows控制台程序,编译环境设置为x64,

           我把ffmpeg sdk放到了程序当前目录,如下图所示:

    展开全文
  • 1、Dxgi截图屏幕 2、FFmpeg 对图像如流生成MP4 2、采用VS2015+QT5.99联合开发 3、1分钟大概1M左右 4、完成了鼠标的绘制 5、未对声音进行录制
  • C++ 通过FFmpeg将rtsp视频流到本地mp4文件,源代码仅供参考。
  • 4.ffmpeg-4.3 5.demo 1.X264 #windows \n\t linux \n 不一样 #库都是在环境变量中 #安装前要先安装 sudo apt-get install build-essential sudo apt-get install nasm sudo apt-get insall yasm sudo apt-get ...

     1.X264
     2.X265

     3.fdk-acc
     4.ffmpeg-4.3
    5.demo

     


    1.X264

     

    #windows  \n\t  linux \n 不一样 #库都是在环境变量中
    #安装前要先安装
    sudo apt-get install build-essential
    sudo apt-get install nasm
    sudo apt-get install  yasm
    sudo apt-get install make cmake
    sudo apt-get install diffutils
    sudo apt-get install pkg-config
    #1. 解压
    tar -xvf x264-master.tar.bz2 
    cd  x264-master              #进目录
    #2.设置配置
    ./configure --enable-shared  --prefix=/usr/ #设置配置项,


     

    make -j32       # 32线程进行编译
    #编译完成界面如下


     

    make install   #安装到 /usr/lib下的

    2.X265

     

    #进入到 cd X265/build/linux/
    #运行./make-Makefiles.bash


     

    make -j32 #32线程编译

    make install 



    3.fdk-acc

     

    #cd /fdk-aac/
    # ./autogen.sh 生成config文件


     

     ./autogen.sh: 
    #错误: autoreconf: not found 
    sudo apt-get install autoconf automake libtool



     

    #编译成动态链接库,并设定路径
    ./configure --enable-shared --prefix=/usr/

    #编译和安装
    make -j32
    make install 



    4.ffmpeg-4.3

     

    ./configure --prefix=/usr/  --enable-shared  --disable-programs --disable-ffplay  --disable-ffmpeg  --disable-ffprobe --enable-libx264 --enable-gpl  --enable-libfdk-aac  --enable-nonfree --enable-libx265

     

    make -j32
    sudo make install 

     

     5.demo

     1.在frist_ffmpeg下创建一个makefile文件,内容如下

    first_ffmpeg:first_ffmpeg.cpp
    		g++ $^ -o $@ -lavcodec

     2.写一个frist_ffmpeg.cpp文件
       

    / first_ffmpeg.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    using namespace std;
    extern "C" { //指定函数是C语言,函数名不包含重载标注
    #include<libavcodec/avcodec.h>
    }
    //预处理指令导入库
    #pragma comment(lib,"avcodec.lib")
    
    int main()
    {
        std::cout << "Hello World!\n";
        cout << avcodec_configuration() << endl;
    }
    

     3.运行
     

    # 1 对前面的makefile make
    make 
    # 2 复制lib
    cp /usr/local/lib/libx265.* /usr/lib/
    
    # 3 运行
    ./first_ffmpeg
    
    

    展开全文
  • c++ ffmpeg实现简单播放器之音频播放

    千次阅读 2020-08-31 14:28:36
    音频播放通过ffmpeg+sdl进行实现,相关代码: #define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio static Uint32 audio_len = 0; static Uint8 *audio_pos = NULL; void fill_audio(void *...

    音频播放通过ffmpeg+sdl进行实现,相关代码:

    #define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio 
    static  Uint32  audio_len = 0;
    static  Uint8  *audio_pos = NULL;
    
    void  fill_audio(void *udata, Uint8 *stream, int len){
    	SDL_memset(stream, 0, len);
    	if (audio_len == 0)
    		return;
    
    	len = (len > audio_len ? audio_len : len);	/*  Mix  as  much  data  as  possible  */
    
    	SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
    	audio_pos += len;
    	audio_len -= len;
    }
    void PlayAudio(const string& strPath)
    {
    	av_register_all();
    	//2.1 打开输入文件
    	AVFormatContext* avFormatContext = avformat_alloc_context();
    	int ret = avformat_open_input(&avFormatContext, strPath.c_str(), NULL, NULL);//读取文件头
    	if (ret != 0){
    		printf("Couldn't open input file.\n");
    		return;
    	}
    	//2.2 获取流信息
    	ret = avformat_find_stream_info(avFormatContext, NULL);
    	if (ret < 0){//获取文件中的流信息
    		printf("Couldn't get input file infomation.\n");
    		return;
    	}
    	//3. 获取对应流的索引号
    	int audioStream_index = -1;//音频流索引号
    	for (int i = 0; i < avFormatContext->nb_streams; i++)
    	{
    		if (avFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
    			audioStream_index = i;
    			break;
    		}
    	}
    	if (audioStream_index == -1){
    		printf("数据不对!\n");
    		return;
    	}
    	//3 获取音频流的编解码上下文
    	AVCodecContext* audioCodecContext = avFormatContext->streams[audioStream_index]->codec;
    	AVCodec* audioCodec = avcodec_find_decoder(audioCodecContext->codec_id);//通过上下文查找编码器
    	if (audioCodec == NULL){
    		printf("Couldn't get AVCodec\n");
    		return;
    	}
    	if (avcodec_open2(audioCodecContext, audioCodec, NULL) < 0){// 打开编码器
    		printf("Couldn't open AVCodec\n");
    		return;
    	}
    	//4.1 开始读取数据
    	AVPacket *avPacket = (AVPacket*)av_malloc(sizeof(AVPacket));//分配avPacket
    	av_init_packet(avPacket);
    
    	uint64_t out_channel_layout = AV_CH_LAYOUT_STEREO;
    	int out_nb_samples = audioCodecContext->frame_size;
    	AVSampleFormat out_sample_fmt = AV_SAMPLE_FMT_S16;
    	int out_sample_rate = 44100;
    	int out_channels = av_get_channel_layout_nb_channels(out_channel_layout);
    	int out_buffer_size = av_samples_get_buffer_size(NULL, out_channels, out_nb_samples, out_sample_fmt, 1);//Out Buffer Size
    	uint8_t* out_buffer = (uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE * 2);
    
    	AVFrame* audioFrame = av_frame_alloc();
    	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
    		printf("Could not initialize SDL - %s\n", SDL_GetError());
    		return;
    	}
    	//SDL_AudioSpec
    	SDL_AudioSpec wanted_spec;
    	wanted_spec.freq = out_sample_rate;
    	wanted_spec.format = AUDIO_S16SYS;
    	wanted_spec.channels = out_channels;
    	wanted_spec.silence = 0;
    	wanted_spec.samples = out_nb_samples;
    	wanted_spec.callback = fill_audio;
    	wanted_spec.userdata = audioCodecContext;
    	if (SDL_OpenAudio(&wanted_spec, NULL)<0){
    		printf("can't open audio.\n");
    		return;
    	}
    	//Swr
    	struct SwrContext * au_convert_ctx = swr_alloc();
    	int64_t in_channel_layout = av_get_default_channel_layout(audioCodecContext->channels);
    	au_convert_ctx = swr_alloc_set_opts(au_convert_ctx, out_channel_layout, out_sample_fmt, out_sample_rate,
    		in_channel_layout, audioCodecContext->sample_fmt, audioCodecContext->sample_rate, 0, NULL);
    	swr_init(au_convert_ctx);
    
    	//Play
    	SDL_PauseAudio(0);
    
    	int got_picture = 0;
    	int64_t start_time = av_gettime_relative();
    	while (av_read_frame(avFormatContext, avPacket) >= 0)
    	{
    		if (avPacket->stream_index == audioStream_index)
    		{
    			ret = avcodec_decode_audio4(audioCodecContext, audioFrame, &got_picture, avPacket);
    			if (ret < 0) {
    				printf("Error in decoding audio frame.\n");
    				return;
    			}
    			if (got_picture > 0){
    				swr_convert(au_convert_ctx, &out_buffer, MAX_AUDIO_FRAME_SIZE, (const uint8_t **)audioFrame->data, audioFrame->nb_samples);
    			}
    			while (audio_len>0)//Wait until finish
    				SDL_Delay(1);
    
    			AVRational time_base = avFormatContext->streams[audioStream_index]->time_base;
    			AVRational time_base_q = { 1, AV_TIME_BASE };
    			int64_t pts_time = av_rescale_q(avPacket->pts, time_base, time_base_q);
    			int64_t now_time = av_gettime_relative() - start_time;
    			if (pts_time > now_time)
    				av_usleep(pts_time - now_time);
    
    			//Audio buffer length
    			audio_len = out_buffer_size;
    			audio_pos = out_buffer;
    		}
    		av_free_packet(avPacket);
    	}
    	SDL_CloseAudio();//Close SDL
    	SDL_Quit();
    	swr_free(&au_convert_ctx);	
    	av_free(out_buffer);
    	avcodec_close(audioCodecContext);
    	avformat_close_input(&avFormatContext);
    	audio_len = 0;
    	audio_pos = NULL;
    }

     

    展开全文
  • 使用Ffmpeg ,VS 2010 C++ 获取视频流中的关键帧,原来下载,直接可以编译
  • c++ ffmpeg库的使用

    万次阅读 2019-02-25 15:51:48
    下载ffmpegsdk: ffmpeg-4.1.1-win32-dev:包含头文件和lib库 ffmpeg-4.1.1-win32-shared:包含动态库... C++工程引用       // SimpleFFmpeg.cpp : 定义控制台应用程序的入口点。 // #include &l...
  • 一个简单的通过c++接口调用ffmpeg实现了读取一段视频并通过opencv显示出来,以及写入文档文件中
  • C++调用ffmpeg推流到流媒体服务器
  • C++ 视频处理 2G9章视频教程 FFmpeg音视频核心技术精讲与实战
  • c++使用ffmpeg把h264/h265和mp3写入mp4文件,内含ffmpeg库、示例demo、视频素材。
  • vs2015 使用ffmpeg获取到rtsp+h.264码流,再利用ffmpeg解码,最后利用directdraw显示,一个完整的播放器实现,本人亲手调试ok
  • FFMPEG_Player 视频录制 播放
  • Android ffmpeg C++算法移植,适用于Android手机、Android开发板。亲测可用。针对Android6.0及以上设置动态添加权限,添加音视频内存等权限。只需修改视频路径即可获取视频对应帧数。亲测可用。具体分析见博客:...
  • ffmpeg拉流后保存为MP4文件
  • C++ 使用ffmpeg实现rtsp取流

    千次阅读 2022-04-20 15:15:39
    C++ 使用ffmpeg实现rtsp取流 flyfish 环境 Ubuntu 18.04 Qt 5.14.2 FFmpeg-n5.0.1 下载 https://git.ffmpeg.org/ffmpeg.git https://github.com/FFmpeg/FFmpeg 这里选择n5.0.1版本 安装编译依赖 sudo apt-get ...
  • C++基于ffmpeg录制声音保存成文件 读取麦克风音频输入并转码成aac格式文件。 依赖ffmpeg
  • QT + C++ ffmpeg打开网络摄像头显示在界面中,可抓取某个镜头片段保存
  • C++,用ffmpeg提取视频转码并另存 ,本例为验证程序,只有这个程序搞懂了,才可能用ffmpge做个播放器什么的。
  • 基于ffmpeg的windows c++程序

    热门讨论 2014-05-31 12:44:36
    基于ffmpeg的windows c++程序,使用c++语言调用ffmpeg函数库,实现音视频媒体文件信息输出。可以参考博客:http://blog.csdn.net/grafx/article/details/27806667
  • 0、如果路径中存在空格,用””把路径包括起来 1、使用ffmpeg命令 ffmpeg -y -framerate 10 -start_...2、c++ 实现 ffmpeg命令 2.1、system方式 // 代码中执行过程中会出现黑屏的闪烁,无法隐藏 system(“ff
  • qt整合ffmpeg实现点击按钮调用ffmpeg获取音频设备
  • C++使用FFmpeg库实现图片转视频

    千次阅读 2021-12-13 11:14:50
    这里的实现是使用ffmpeg4.1版本。 环境:Centos7.4 FFmpeg安装目录:/usr/local/ffmpeg g++版本:4.8.5 在ffmpeg4.1的版本中有一个转封装的示例代码:remuxing.c,实现的是视频文件的封装转换。 用这个示例修改...
  • C++基于ffmpeg和QT开发播放器 B站网址 https://www.bilibili.com/video/BV1h44y1t7D8?p=2&spm_id_from=pageDriver 封装格式和编码格式 格式头:使用什么压缩方式,帧率是多少,音频采用什么压缩方式,视频采用...
  • 它支持的格式非常多,可以跨越多个操作系统,解码效率非常高,很多的播放器都是基于ffmpeg,它部分基于GPL协议,部分基于LGPL。GPL是开源社区非常流行的协议,包括Linux的版本也是这个,它要求你基于它开发的软件也...
  • C++ 调用 ffmpeg 进行 rtmp 推流

    千次阅读 2021-09-29 09:33:15
    C++ 调用 ffmpeg 进行 rtmp 推流

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,694
精华内容 8,277
关键字:

c++ ffmpeg

友情链接: MessageBoard.zip