Ubuntu16.04中怎么安装ffmpeg
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这期内容当中小编将会给大家带来有关Ubuntu16.04中怎么安装ffmpeg ,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一.ffmpeg安装第一步:添加源。s
千家信息网最后更新 2026年11月03日Ubuntu16.04中怎么安装ffmpeg
这期内容当中小编将会给大家带来有关Ubuntu16.04中怎么安装ffmpeg ,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
一.ffmpeg安装
第一步:添加源。
sudo add-apt-repository ppa:djcj/hybrid
第二步:更新源。
sudo apt-get update
第三步:下载安装。
sudo apt-get install ffmpeg
第四步:验证。
sudo ffmpeg -version
二.C语言调用ffmpeg库实现rtsp视频流解析并存储为ppm格式图片
1.参考:
https://stackoverflow.com/questions/10715170/receiving-rtsp-stream-using-ffmpeg-library
2.代码:my_streamer.cpp
#include#include #include #include #include extern "C" {#include #include #include #include }int main(int argc, char** argv) { // Open the initial context variables that are needed SwsContext *img_convert_ctx; AVFormatContext* format_ctx = avformat_alloc_context(); AVCodecContext* codec_ctx = NULL; int video_stream_index; // Register everything av_register_all(); avformat_network_init(); //open RTSP if (avformat_open_input(&format_ctx, "rtsp://134.169.178.187:8554/h364.3gp", NULL, NULL) != 0) { return EXIT_FAILURE; } if (avformat_find_stream_info(format_ctx, NULL) < 0) { return EXIT_FAILURE; } //search video stream for (int i = 0; i < format_ctx->nb_streams; i++) { if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) video_stream_index = i; } AVPacket packet; av_init_packet(&packet); //open output file AVFormatContext* output_ctx = avformat_alloc_context(); AVStream* stream = NULL; int cnt = 0; //start reading packets from stream and write them to file av_read_play(format_ctx); //play RTSP // Get the codec AVCodec *codec = NULL; codec = avcodec_find_decoder(AV_CODEC_ID_H264); if (!codec) { exit(1); } // Add this to allocate the context by codec codec_ctx = avcodec_alloc_context3(codec); avcodec_get_context_defaults3(codec_ctx, codec); avcodec_copy_context(codec_ctx, format_ctx->streams[video_stream_index]->codec); std::ofstream output_file; if (avcodec_open2(codec_ctx, codec, NULL) < 0) exit(1); img_convert_ctx = sws_getContext(codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt, codec_ctx->width, codec_ctx->height, AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); int size = avpicture_get_size(AV_PIX_FMT_YUV420P, codec_ctx->width, codec_ctx->height); uint8_t* picture_buffer = (uint8_t*) (av_malloc(size)); AVFrame* picture = av_frame_alloc(); AVFrame* picture_rgb = av_frame_alloc(); int size2 = avpicture_get_size(AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height); uint8_t* picture_buffer_2 = (uint8_t*) (av_malloc(size2)); avpicture_fill((AVPicture *) picture, picture_buffer, AV_PIX_FMT_YUV420P, codec_ctx->width, codec_ctx->height); avpicture_fill((AVPicture *) picture_rgb, picture_buffer_2, AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height); while (av_read_frame(format_ctx, &packet) >= 0 && cnt < 1000) { //read ~ 1000 frames std::cout << "1 Frame: " << cnt << std::endl; if (packet.stream_index == video_stream_index) { //packet is video std::cout << "2 Is Video" << std::endl; if (stream == NULL) { //create stream in file std::cout << "3 create stream" << std::endl; stream = avformat_new_stream(output_ctx, format_ctx->streams[video_stream_index]->codec->codec); avcodec_copy_context(stream->codec, format_ctx->streams[video_stream_index]->codec); stream->sample_aspect_ratio = format_ctx->streams[video_stream_index]->codec->sample_aspect_ratio; } int check = 0; packet.stream_index = stream->id; std::cout << "4 decoding" << std::endl; int result = avcodec_decode_video2(codec_ctx, picture, &check, &packet); std::cout << "Bytes decoded " << result << " check " << check << std::endl; if (cnt > 100) //cnt < 0) { sws_scale(img_convert_ctx, picture->data, picture->linesize, 0, codec_ctx->height, picture_rgb->data, picture_rgb->linesize); std::stringstream file_name; file_name << "test" << cnt << ".ppm"; output_file.open(file_name.str().c_str()); output_file << "P3 " << codec_ctx->width << " " << codec_ctx->height << " 255\n"; for (int y = 0; y < codec_ctx->height; y++) { for (int x = 0; x < codec_ctx->width * 3; x++) output_file << (int) (picture_rgb->data[0] + y * picture_rgb->linesize[0])[x] << " "; } output_file.close(); } cnt++; } av_free_packet(&packet); av_init_packet(&packet); } av_free(picture); av_free(picture_rgb); av_free(picture_buffer); av_free(picture_buffer_2); av_read_pause(format_ctx); avio_close(output_ctx->pb); avformat_free_context(output_ctx); return (EXIT_SUCCESS);}
3.依赖库安装
apt install libavformat-devapt install libavcodec-devapt install libswresample-devapt install libswscale-devapt install libavutil-devsudo apt-get install libsdl1.2-devsudo apt-get install libsdl-image1.2-devsudo apt-get install libsdl-mixer1.2-devsudo apt-get install libsdl-ttf2.0-devsudo apt-get install libsdl-gfx1.2-dev
4.编译
g++ -w my_streamer.cpp -o my_streamer $(pkg-config --cflags --libs libavformat libswscale libavcodec libavutil)
5.运行
./my_streamer
三.C语言调用ffmpeg库实现rtsp视频流解析并存储为ppm或jpg格式图片,并通过opencv显示
1.代码:my_streamer.cpp
#include#include #include #include #include #include #include #include #include extern "C" {#include #include #include #include }static void CopyDate(AVFrame *pictureFrame,int width,int height,int time);//static void SaveFrame_mmp(AVFrame *pictureFrame, int width, int height, int iFrame);static void SaveFrame_jpg_uselibjpeg(AVFrame *pictureFrame, int width, int height, int iFrame);int main(int argc, char** argv) { // Open the initial context variables that are needed SwsContext *img_convert_ctx; AVFormatContext* format_ctx = avformat_alloc_context(); AVCodecContext* codec_ctx = NULL; int video_stream_index; // Register everything av_register_all(); avformat_network_init(); //open RTSP if (avformat_open_input(&format_ctx, "rtsp://192.168.31.100:8656/main", NULL, NULL) != 0) { return EXIT_FAILURE; } if (avformat_find_stream_info(format_ctx, NULL) < 0) { return EXIT_FAILURE; } //search video stream for (int i = 0; i < format_ctx->nb_streams; i++) { if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) video_stream_index = i; } AVPacket packet; av_init_packet(&packet); //open output file AVFormatContext* output_ctx = avformat_alloc_context(); AVStream* stream = NULL; int cnt = 0; //start reading packets from stream and write them to file av_read_play(format_ctx); //play RTSP // Get the codec AVCodec *codec = NULL; codec = avcodec_find_decoder(AV_CODEC_ID_H264); if (!codec) { exit(1); } // Add this to allocate the context by codec codec_ctx = avcodec_alloc_context3(codec); avcodec_get_context_defaults3(codec_ctx, codec); avcodec_copy_context(codec_ctx, format_ctx->streams[video_stream_index]->codec); std::ofstream output_file; if (avcodec_open2(codec_ctx, codec, NULL) < 0) exit(1); img_convert_ctx = sws_getContext(codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt, codec_ctx->width, codec_ctx->height, AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); int size = avpicture_get_size(AV_PIX_FMT_YUV420P, codec_ctx->width, codec_ctx->height); uint8_t* picture_buffer = (uint8_t*) (av_malloc(size)); AVFrame* picture = av_frame_alloc(); AVFrame* picture_rgb = av_frame_alloc(); int size2 = avpicture_get_size(AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height); uint8_t* picture_buffer_2 = (uint8_t*) (av_malloc(size2)); avpicture_fill((AVPicture *) picture, picture_buffer, AV_PIX_FMT_YUV420P, codec_ctx->width, codec_ctx->height); avpicture_fill((AVPicture *) picture_rgb, picture_buffer_2, AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height); //geyg AVFrame *pictureRGB; int numBytes; uint8_t *buffer; int i=0; long prepts = 0; pictureRGB=avcodec_alloc_frame(); if(pictureRGB==NULL) return -1; // Determine required buffer size and allocate buffer numBytes=avpicture_get_size(PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height); buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); // Assign appropriate parts of buffer to image planes in pFrameRGB avpicture_fill((AVPicture *)pictureRGB, buffer, PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height); while (av_read_frame(format_ctx, &packet) >= 0 && cnt < 1000) { //read ~ 1000 frames std::cout << "1 Frame: " << cnt << std::endl; if (packet.stream_index == video_stream_index) { //packet is video std::cout << "2 Is Video" << std::endl; if (stream == NULL) { //create stream in file std::cout << "3 create stream" << std::endl; stream = avformat_new_stream(output_ctx, format_ctx->streams[video_stream_index]->codec->codec); avcodec_copy_context(stream->codec, format_ctx->streams[video_stream_index]->codec); stream->sample_aspect_ratio = format_ctx->streams[video_stream_index]->codec->sample_aspect_ratio; } int check = 0; packet.stream_index = stream->id; std::cout << "4 decoding" << std::endl; int result = avcodec_decode_video2(codec_ctx, picture, &check, &packet); std::cout << "Bytes decoded " << result << " check " << check << std::endl; if(check!=0 && cnt > 100) { static struct SwsContext *img_convert_ctx; // Convert the image into YUV format that SDL uses if(img_convert_ctx == NULL) { int w = codec_ctx->width; int h = codec_ctx->height; img_convert_ctx = sws_getContext(w, h, codec_ctx->pix_fmt, w, h, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); if(img_convert_ctx == NULL) { fprintf(stderr, "Cannot initialize the conversion context!\n"); exit(1); } } int ret = sws_scale(img_convert_ctx, picture->data, picture->linesize, 0, codec_ctx->height, pictureRGB->data, pictureRGB->linesize); // Save the frame to disk SaveFrame_jpg_uselibjpeg(pictureRGB, codec_ctx->width, codec_ctx->height, cnt); CopyDate(pictureRGB, codec_ctx->width, codec_ctx->height,packet.pts-prepts); prepts = packet.pts; }/* if (cnt > 100) //cnt < 0) { sws_scale(img_convert_ctx, picture->data, picture->linesize, 0, codec_ctx->height, picture_rgb->data, picture_rgb->linesize); std::stringstream file_name; file_name << "test" << cnt << ".ppm"; output_file.open(file_name.str().c_str()); output_file << "P3 " << codec_ctx->width << " " << codec_ctx->height << " 255\n"; for (int y = 0; y < codec_ctx->height; y++) { for (int x = 0; x < codec_ctx->width * 3; x++) output_file << (int) (picture_rgb->data[0] + y * picture_rgb->linesize[0])[x] << " "; } output_file.close(); }*/ cnt++; } av_free_packet(&packet); av_init_packet(&packet); } av_free(picture); av_free(picture_rgb); av_free(picture_buffer); av_free(picture_buffer_2); av_read_pause(format_ctx); avio_close(output_ctx->pb); avformat_free_context(output_ctx); return (EXIT_SUCCESS);}static void CopyDate(AVFrame *picture,int width,int height,int time){ if(time <=0 ) time = 1; int nChannels; int stepWidth; uchar* pData; cv::Mat frameImage(cv::Size(width, height), CV_8UC3, cv::Scalar(0)); stepWidth = frameImage.step; nChannels = frameImage.channels(); pData = frameImage.data; for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) { pData[i*stepWidth+j*nChannels+0] = picture->data[0][i*picture->linesize[0]+j*nChannels+2]; pData[i*stepWidth+j*nChannels+1] = picture->data[0][i*picture->linesize[0]+j*nChannels+1]; pData[i*stepWidth+j*nChannels+2] = picture->data[0][i*picture->linesize[0]+j*nChannels+0]; } } cv::namedWindow("Video", cv::WINDOW_NORMAL); cv::imshow("Video", frameImage); cv::waitKey(1);}static void SaveFrame_mmp(AVFrame *picture, int width, int height, int iFrame){ FILE *pFile; char szFilename[32]; int y; // Open file sprintf(szFilename, "frame%d.ppm", iFrame); pFile=fopen(szFilename, "wb"); if(pFile==NULL) { printf("%s\n","create file fail!"); return; } // Write header fprintf(pFile, "P6\n%d %d\n255\n", width, height); // Write pixel data for(y=0; y data[0]+y*picture->linesize[0], 1, width*3, pFile); // Close file fclose(pFile);}static void SaveFrame_jpg_uselibjpeg(AVFrame* pFrame, int width, int height, int iFrame){ char fname[128] = { 0 }; struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; int row_stride; uint8_t *buffer; FILE *fp; buffer = pFrame->data[0]; sprintf(fname, "%s%d.jpg", "frame", iFrame); fp = fopen(fname, "wb"); cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, fp); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, 80, true); jpeg_start_compress(&cinfo, TRUE); row_stride = width * 3; while (cinfo.next_scanline < height) { row_pointer[0] = &buffer[cinfo.next_scanline * row_stride]; (void)jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); fclose(fp); jpeg_destroy_compress(&cinfo); return;}
2.依赖库安装
1.安装opencv:用户显示2.apt install libavformat-devapt install libavcodec-devapt install libswresample-devapt install libswscale-devapt install libavutil-devapt install libjpeg-dev3.sudo apt-get install libsdl1.2-devsudo apt-get install libsdl-image1.2-devsudo apt-get install libsdl-mixer1.2-devsudo apt-get install libsdl-ttf2.0-devsudo apt-get install libsdl-gfx1.2-dev4.ubuntu下zmq安装(1)下载zmq:wget http://download.zeromq.org/zeromq-4.1.4.tar.gz (可以将"4.1.4"改成当前最新版本编号)(2)解压:tar -zxvf zeromq-4.1.4.tar.gz(3)编译安装A.执行configure文件:./configure 出现错误: configure: error: Package requirements (libsodium) were not met: No package 'libsodium' found 解决方案:忽略这个库 ./configure --prefix=/home/ygy/zmq --without-libsodium(prefix中的路径是zmq存放的目录)B.编译:makeC.安装:make installD.配置环境变量 vi /etc/profile export C_INCLUDE_PATH="$C_INCLUDE_PATH:/usr/local/include" export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/usr/local/include" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/lib"C语言zmq使用引用:#include
3.编译
g++ -w my_streamer.cpp -o my_streamer $(pkg-config --cflags --libs libavformat libswscale libavcodec libavutil opencv libjpeg libzmq)
4.运行
./my_streamer
四.C语言调用ffmpeg库实现本地视频播放
2.依赖库安装:见上节二.3
3.编译:
git clone https://github.com/mpenkov/ffmpeg-tutorial.gitcd ffmpeg-tutorialmake
4.运行:
./tutorial01.out ×.avi
上述就是小编为大家分享的Ubuntu16.04中怎么安装ffmpeg 了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
编译
语言
视频
运行
代码
内容
图片
格式
视频流
分析
存储
专业
中小
内容丰富
变量
就是
文件
文章
方案
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
南京欣网互联网络科技
科技与互联网
互联网与科技金融数据
礼当家互联网科技
互联网科技作文
山东吉时兔互联网科技有限公司
青海省互联网新科技
西藏七维空间互联网科技有限公司
深圳国际航运科技和互联网
互联网大会黑科技排名
威龙国际互联网科技公司
济南有互联网科技公司吗
九思连强互联网电子科技有限公司
互联网领先科技活动
广州三三互联网科技有限公司
玉溪新华互联网科技怎么选
互联网科技对化妆品行业
上海旺乐尼互联网科技有限公司
高科技和互联网的现代国家
前海云享互联网科技
科技金融是不是互联网金融
碳银互联网科技有限公司
成都狮子座互联网科技
互联网科技教育视频
青岛科技大学互联网大赛研究生
互联网领先科技宣传片
唐山双旺合互联网科技产业园
网互联网络科技
中国主要互联网科技公司
前海云享互联网科技