(ffmpeg)ffmpeg+SDL的简单播放器(雷霄骅)更新版

2023-11-17

代码源自雷神,一个是播放音频的demo,可以播放MP3和AAC,但是MP3应该是没有封面的。另一个是播放ts格式的视频,没有声音。源码可以到雷神博客下载,但是因为ffmpeg库的更新问题,并不能直接在ubuntu下直接运行,笔者做了修改,在ubuntu 18.04下可以直接编译运行。

环境配置请参考之前的博文:

(ffmpeg)ubuntu18.04安装ffmpeg4.4

ffmpeg版本:4.4

1.音频播放器

/**

 * 最简单的基于FFmpeg的音频播放器 2 

 * Simplest FFmpeg Audio Player 2 

 *

 * 雷霄骅 Lei Xiaohua

 * leixiaohua1020@126.com

 * 中国传媒大学/数字电视技术

 * Communication University of China / Digital TV Technology

 * http://blog.csdn.net/leixiaohua1020

 *

 * 本程序实现了音频的解码和播放。

 * 是最简单的FFmpeg音频解码方面的教程。

 * 通过学习本例子可以了解FFmpeg的解码流程。

 *

 * 该版本使用SDL 2.0替换了第一个版本中的SDL 1.0。

 * 注意:SDL 2.0中音频解码的API并无变化。唯一变化的地方在于

 * 其回调函数的中的Audio Buffer并没有完全初始化,需要手动初始化。

 * 本例子中即SDL_memset(stream, 0, len);

 *

 * This software decode and play audio streams.

 * Suitable for beginner of FFmpeg.

 *

 * This version use SDL 2.0 instead of SDL 1.2 in version 1

 * Note:The good news for audio is that, with one exception, 

 * it's entirely backwards compatible with 1.2.

 * That one really important exception: The audio callback 

 * does NOT start with a fully initialized buffer anymore. 

 * You must fully write to the buffer in all cases. In this 

 * example it is SDL_memset(stream, 0, len);

 *

 * Version 2.0

 */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define __STDC_CONSTANT_MACROS



#ifdef _WIN32

//Windows

extern "C"

{

#include "libavcodec/avcodec.h"

#include "libavformat/avformat.h"

#include "libswresample/swresample.h"

#include "SDL2/SDL.h"

};

#else

//Linux...

#ifdef __cplusplus

extern "C"

{

#endif

#include <libavcodec/avcodec.h>

#include <libavformat/avformat.h>

#include <libswresample/swresample.h>

#include <SDL2/SDL.h>

#ifdef __cplusplus

};

#endif

#endif



#define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio



//Output PCM

#define OUTPUT_PCM 0

//Use SDL

#define USE_SDL 1



//Buffer:

//|-----------|-------------|

//chunk-------pos---len-----|

static  Uint8  *audio_chunk; 

static  Uint32  audio_len; 

static  Uint8  *audio_pos; 



/* The audio function callback takes the following parameters: 

 * stream: A pointer to the audio buffer to be filled 

 * len: The length (in bytes) of the audio buffer 

*/ 

void  fill_audio(void *udata,Uint8 *stream,int len){ 

	//SDL 2.0

	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);

	memcpy(stream, audio_pos, len);

	audio_pos += len; 

	audio_len -= len; 

} 

//-----------------





int main(int argc, char* argv[])

{

	AVFormatContext	*pFormatCtx;

	int				i, audioStream;

	AVCodecContext	*pCodecCtx;

	const AVCodec			*pCodec;

	AVPacket		*packet;

	uint8_t			*out_buffer;

	AVFrame			*pFrame;

	SDL_AudioSpec wanted_spec;

    int ret;

	uint32_t len = 0;

	int got_picture;

	int index = 0;

	int64_t in_channel_layout;

	struct SwrContext *au_convert_ctx;



	FILE *pFile=NULL;

	char url[]="WavinFlag.aac";//xiaoqingge.mp3



	// av_register_all();//modify

	avformat_network_init();

	pFormatCtx = avformat_alloc_context();

	//Open

	if(avformat_open_input(&pFormatCtx,url,NULL,NULL)!=0){

		printf("Couldn't open input stream.\n");

		return -1;

	}

	// Retrieve stream information

	if(avformat_find_stream_info(pFormatCtx,NULL)<0){

		printf("Couldn't find stream information.\n");

		return -1;

	}

	// Dump valid information onto standard error

	av_dump_format(pFormatCtx, 0, url, false);



	// Find the first audio stream

	audioStream=-1;

	for(i=0; i < pFormatCtx->nb_streams; i++)

		if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_AUDIO){

		// if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){

			audioStream=i;

			break;

		}



	if(audioStream==-1){

		printf("Didn't find a audio stream.\n");

		return -1;

	}



	// Get a pointer to the codec context for the audio stream

	pCodecCtx = avcodec_alloc_context3(NULL);

	if(pCodecCtx == NULL)

	{

		printf("pCodecCtx err\r\n");

		return -1;

	}

	avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[audioStream]->codecpar);

	// pCodecCtx=pFormatCtx->streams[audioStream]->codec;



	pCodecCtx->pkt_timebase = pFormatCtx->streams[audioStream]->time_base;

	// Find the decoder for the audio stream

	pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

	if(pCodec==NULL){

		printf("Codec not found.\n");

		return -1;

	}



	// Open codec

	if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){

		printf("Could not open codec.\n");

		return -1;

	}



	

#if OUTPUT_PCM

	pFile=fopen("output.pcm", "wb");

#endif



	packet=(AVPacket *)av_malloc(sizeof(AVPacket));

	// av_init_packet(packet);



	//Out Audio Param

	uint64_t out_channel_layout=AV_CH_LAYOUT_STEREO;

	//nb_samples: AAC-1024 MP3-1152

	int out_nb_samples=pCodecCtx->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);

	//Out Buffer Size

	int out_buffer_size=av_samples_get_buffer_size(NULL,out_channels ,out_nb_samples,out_sample_fmt, 1);



	out_buffer=(uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE*2);

	pFrame=av_frame_alloc();

//SDL------------------

#if USE_SDL

	//Init

	if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {  

		printf( "Could not initialize SDL - %s\n", SDL_GetError()); 

		return -1;

	}

	//SDL_AudioSpec

	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 = pCodecCtx; 



	if (SDL_OpenAudio(&wanted_spec, NULL)<0){ 

		printf("can't open audio.\n"); 

		return -1; 

	} 

#endif



	//FIX:Some Codec's Context Information is missing

	in_channel_layout=av_get_default_channel_layout(pCodecCtx->channels);

	//Swr



	au_convert_ctx = swr_alloc();

	au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,out_channel_layout, out_sample_fmt, out_sample_rate,

		in_channel_layout,pCodecCtx->sample_fmt , pCodecCtx->sample_rate,0, NULL);

	swr_init(au_convert_ctx);



	//Play

	SDL_PauseAudio(0);



	while(av_read_frame(pFormatCtx, packet)>=0){

		if(packet->stream_index==audioStream){

			// ret = avcodec_decode_audio4( pCodecCtx, pFrame,&got_picture, packet);

			ret = avcodec_send_packet(pCodecCtx, packet);

			if ( ret < 0 ) {

				continue;

            }

			got_picture = avcodec_receive_frame(pCodecCtx, pFrame); //got_picture = 0 success, a frame was returned

			// if ( ret < 0 ) {

            //     printf("Error in decoding audio frame.\n");

            //     return -1;

            // }

			if ( got_picture == 0 ){

				swr_convert(au_convert_ctx,&out_buffer, MAX_AUDIO_FRAME_SIZE,(const uint8_t **)pFrame->data , pFrame->nb_samples);

#if 1

				printf("index:%5d\t pts:%ld\t packet size:%d\n",index,packet->pts,packet->size);

#endif





#if OUTPUT_PCM

				//Write PCM

				fwrite(out_buffer, 1, out_buffer_size, pFile);

#endif

				index++;

			}



#if USE_SDL

			while(audio_len>0)//Wait until finish

				SDL_Delay(1); 



			//Set audio buffer (PCM data)

			audio_chunk = (Uint8 *) out_buffer; 

			//Audio buffer length

			audio_len =out_buffer_size;

			audio_pos = audio_chunk;



#endif

		}

		// av_free_packet(packet);

		av_packet_unref(packet);

	}



	swr_free(&au_convert_ctx);



#if USE_SDL

	SDL_CloseAudio();//Close SDL

	SDL_Quit();

#endif

	

#if OUTPUT_PCM

	fclose(pFile);

#endif

	av_free(out_buffer);

	avcodec_close(pCodecCtx);

	avformat_close_input(&pFormatCtx);



	return 0;

}





编译:

gcc simplest_ffmpeg_audio_player.cpp -g -o simplest_ffmpeg_audio_player.out -I /usr/local/include -L /usr/local/lib \
-lSDL2main -lSDL2 -lavformat -lavcodec -lavutil -lswresample -lm -lpthread

2.视频播放器

/**

 * 最简单的基于FFmpeg的视频播放器2(SDL升级版)

 * Simplest FFmpeg Player 2(SDL Update)

 *

 * 雷霄骅 Lei Xiaohua

 * leixiaohua1020@126.com

 * 中国传媒大学/数字电视技术

 * Communication University of China / Digital TV Technology

 * http://blog.csdn.net/leixiaohua1020

 *

 * 第2版使用SDL2.0取代了第一版中的SDL1.2

 * Version 2 use SDL 2.0 instead of SDL 1.2 in version 1.

 *

 * 本程序实现了视频文件的解码和显示(支持HEVC,H.264,MPEG2等)。

 * 是最简单的FFmpeg视频解码方面的教程。

 * 通过学习本例子可以了解FFmpeg的解码流程。

 * 本版本中使用SDL消息机制刷新视频画面。

 * This software is a simplest video player based on FFmpeg.

 * Suitable for beginner of FFmpeg.

 *

 * 备注:

 * 标准版在播放视频的时候,画面显示使用延时40ms的方式。这么做有两个后果:

 * (1)SDL弹出的窗口无法移动,一直显示是忙碌状态

 * (2)画面显示并不是严格的40ms一帧,因为还没有考虑解码的时间。

 * SU(SDL Update)版在视频解码的过程中,不再使用延时40ms的方式,而是创建了

 * 一个线程,每隔40ms发送一个自定义的消息,告知主函数进行解码显示。这样做之后:

 * (1)SDL弹出的窗口可以移动了

 * (2)画面显示是严格的40ms一帧

 * Remark:

 * Standard Version use's SDL_Delay() to control video's frame rate, it has 2

 * disadvantages:

 * (1)SDL's Screen can't be moved and always "Busy".

 * (2)Frame rate can't be accurate because it doesn't consider the time consumed 

 * by avcodec_decode_video2()

 * SU(SDL Update)Version solved 2 problems above. It create a thread to send SDL 

 * Event every 40ms to tell the main loop to decode and show video frames.

 */



#include <stdio.h>



#define __STDC_CONSTANT_MACROS



#ifdef _WIN32

//Windows

extern "C"

{

#include "libavcodec/avcodec.h"

#include "libavformat/avformat.h"

#include "libswscale/swscale.h"

#include "libavutil/imgutils.h"

#include "SDL2/SDL.h"

};

#else

//Linux...

#ifdef __cplusplus

extern "C"

{

#endif

#include <libavcodec/avcodec.h>

#include <libavformat/avformat.h>

#include <libswscale/swscale.h>

#include <libavutil/imgutils.h>

#include <SDL2/SDL.h>

#ifdef __cplusplus

};

#endif

#endif



//Refresh Event

#define SFM_REFRESH_EVENT  (SDL_USEREVENT + 1)



#define SFM_BREAK_EVENT  (SDL_USEREVENT + 2)



int thread_exit=0;

int thread_pause=0;



int sfp_refresh_thread(void *opaque){

	thread_exit=0;

	thread_pause=0;



	while (!thread_exit) {

		if(!thread_pause){

			SDL_Event event;

			event.type = SFM_REFRESH_EVENT;

			SDL_PushEvent(&event);

		}

		SDL_Delay(40);

	}

	thread_exit=0;

	thread_pause=0;

	//Break

	SDL_Event event;

	event.type = SFM_BREAK_EVENT;

	SDL_PushEvent(&event);



	return 0;

}





int main(int argc, char* argv[])

{



	AVFormatContext	*pFormatCtx;

	int				i, videoindex;

	AVCodecContext	*pCodecCtx;

	const AVCodec			*pCodec;

	AVFrame	*pFrame,*pFrameYUV;

	unsigned char *out_buffer;

	AVPacket *packet;

	int ret, got_picture;



	//------------SDL----------------

	int screen_w,screen_h;

	SDL_Window *screen; 

	SDL_Renderer* sdlRenderer;

	SDL_Texture* sdlTexture;

	SDL_Rect sdlRect;

	SDL_Thread *video_tid;

	SDL_Event event;



	struct SwsContext *img_convert_ctx;



	//char filepath[]="bigbuckbunny_480x272.h265";

	char filepath[]="Titanic.ts";



	// av_register_all();

	avformat_network_init();

	pFormatCtx = avformat_alloc_context();



	if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0){

		printf("Couldn't open input stream.\n");

		return -1;

	}

	if(avformat_find_stream_info(pFormatCtx,NULL)<0){

		printf("Couldn't find stream information.\n");

		return -1;

	}

	videoindex=-1;

	for(i=0; i<pFormatCtx->nb_streams; i++) 

			if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO){

		// if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){

			videoindex=i;

			break;

		}

	if(videoindex==-1){

		printf("Didn't find a video stream.\n");

		return -1;

	}

	// pCodecCtx=pFormatCtx->streams[videoindex]->codec;

	// pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

	pCodecCtx = avcodec_alloc_context3(NULL);

	if(pCodecCtx == NULL)

	{

		printf("pCodecCtx err\r\n");

		return -1;

	}

	avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[videoindex]->codecpar);

	pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

	if(pCodec==NULL){

		printf("Codec not found.\n");

		return -1;

	}

	if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){

		printf("Could not open codec.\n");

		return -1;

	}

	pFrame=av_frame_alloc();

	pFrameYUV=av_frame_alloc();



	out_buffer=(unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P,  pCodecCtx->width, pCodecCtx->height,1));

	av_image_fill_arrays(pFrameYUV->data, pFrameYUV->linesize,out_buffer,

		AV_PIX_FMT_YUV420P,pCodecCtx->width, pCodecCtx->height,1);



	//Output Info-----------------------------

	printf("---------------- File Information ---------------\n");

	av_dump_format(pFormatCtx,0,filepath,0);

	printf("-------------------------------------------------\n");

	

	img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, 

		pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); 

	



	if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {  

		printf( "Could not initialize SDL - %s\n", SDL_GetError()); 

		return -1;

	} 

	//SDL 2.0 Support for multiple windows

	screen_w = pCodecCtx->width;

	screen_h = pCodecCtx->height;

	screen = SDL_CreateWindow("Simplest ffmpeg player's Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,

		screen_w, screen_h,SDL_WINDOW_OPENGL);



	if(!screen) {  

		printf("SDL: could not create window - exiting:%s\n",SDL_GetError());  

		return -1;

	}

	sdlRenderer = SDL_CreateRenderer(screen, -1, 0);  

	//IYUV: Y + U + V  (3 planes)

	//YV12: Y + V + U  (3 planes)

	sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING,pCodecCtx->width,pCodecCtx->height);  



	sdlRect.x=0;

	sdlRect.y=0;

	sdlRect.w=screen_w;

	sdlRect.h=screen_h;



	packet=(AVPacket *)av_malloc(sizeof(AVPacket));



	video_tid = SDL_CreateThread(sfp_refresh_thread,NULL,NULL);

	//------------SDL End------------

	//Event Loop

	

	for (;;) {

		//Wait

		SDL_WaitEvent(&event);

		if(event.type==SFM_REFRESH_EVENT){

			while(1){

				if(av_read_frame(pFormatCtx, packet)<0)

					thread_exit=1;



				if(packet->stream_index==videoindex)

					break;

			}

			// ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);

			ret = avcodec_send_packet(pCodecCtx, packet);

			if(ret < 0){

				continue;

			}

			got_picture = avcodec_receive_frame(pCodecCtx, pFrame);

			// if(ret < 0){

			// 	printf("Decode Error.\n");

			// 	return -1;

			// }

			if(got_picture == 0){

				sws_scale(img_convert_ctx, (const unsigned char* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data, pFrameYUV->linesize);

				//SDL---------------------------

				SDL_UpdateTexture( sdlTexture, NULL, pFrameYUV->data[0], pFrameYUV->linesize[0] );  

				SDL_RenderClear( sdlRenderer );  

				//SDL_RenderCopy( sdlRenderer, sdlTexture, &sdlRect, &sdlRect );  

				SDL_RenderCopy( sdlRenderer, sdlTexture, NULL, NULL);  

				SDL_RenderPresent( sdlRenderer );  

				//SDL End-----------------------

			}

			// av_free_packet(packet);

			av_packet_unref(packet);

		}else if(event.type==SDL_KEYDOWN){

			//Pause

			if(event.key.keysym.sym==SDLK_SPACE)

				thread_pause=!thread_pause;

		}else if(event.type==SDL_QUIT){

			thread_exit=1;

		}else if(event.type==SFM_BREAK_EVENT){

			break;

		}



	}

	// av_packet_unref(packet);

	sws_freeContext(img_convert_ctx);



	SDL_Quit();

	//--------------

	av_frame_free(&pFrameYUV);

	av_frame_free(&pFrame);

	avcodec_close(pCodecCtx);

	avformat_close_input(&pFormatCtx);



	return 0;

}



编译:

gcc simplest_ffmpeg_player_su.cpp -g -o simplest_ffmpeg_player_su.out -I /usr/local/include -L /usr/local/lib \
-lSDL2main -lSDL2 -lavformat -lavcodec -lavutil -lswscale -lm -lpthread -lswresample

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(ffmpeg)ffmpeg+SDL的简单播放器(雷霄骅)更新版 的相关文章

  • FFmpeg - 来自 NodeJS 的 RTMP 流,流比实时更快

    我的目标是在 Node 中渲染画布 并将该画布流式传输到 RTMP 服务器 最终是 Twitch 但现在我正在在本地 RTMP 服务器上测试 流式传输到 RTMP 的标准方式似乎是ffmpeg 所以我使用它 从 NodeJS 中作为子进程生
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • 使用FFMpeg确定视频类型,然后进行转换?

    我正在尝试以编程方式确定文件的真实类型 看来我必须使用 FFMPeg 来实现这一点 我想确定上传的文件实际上是否是 MP4 或 FLV 对于 Flash 视频 或 WebM 对于 HTML5 我知道 FFMPeg 中的 i 运算符 但我不知
  • 两个图像之间的视频变形,FFMPEG/Minterpolate

    我正在尝试在 Ubuntu Linux 上的 bash 脚本中使用两个帧 png 图像 和 ffmpeg 的 minterpolate 过滤器制作一个快速且简单的变形视频 目的是稍后使用变形作为不同视频编辑器中相似视频之间的过渡 它适用于
  • Ffmpeg 无法正确转换为 ogg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在使用 ffmpeg 在我的网站上转换音频和视频 Ffmpeg 可以正确转换为其他格式 如 mp3 mp4 等 但无法正确转换为 ogg 虽然 f
  • 致命错误:libavcodec/avcodec.h 没有这样的文件或目录编译终止

    我正在尝试使用 gcc 执行tutorial01 c 并且 gcc 和tutorial01 c 以及 libavcodec 和 libavformat 及其关联文件位于同一文件夹中 它给了我这个错误 致命错误 libavcodec avco
  • 如何使用 ffmpeg 设置默认流

    我有一些 m4v 文件 我想用 ffmpeg 添加字幕 我知道我需要映射流以将它们放入输出文件中 但如何确保此字幕流将是默认流 字幕是 srt 人们似乎说它们与 mp4 容器不兼容 我需要先将字幕转换为什么 另外 各种流的顺序重要吗 视频流
  • Xuggler 未转换 .webm 文件?

    我只是尝试使用 Xuggler 将 mov 文件转换为 webm 这应该可以工作 因为 FFMPEG 支持 webm 文件 这是我的代码 IMediaReader reader ToolFactory makeReader home use
  • 如何启用 FFMPEG 日志记录?

    我想调试 ffmpeg 我添加以下代码来打印日志 av log s AV LOG PANIC fmt or printf msg 但这行不通 没有任何调试信息 然后我启用调试构建选项 export COMMON FF CFG FLAGS C
  • FFMPEG:将 YUV 数据转储到 AVFrame 结构中

    我正在尝试转储YUV420数据进入AVFrameFFMPEG 的结构 从下面的链接 http ffmpeg org doxygen trunk structAVFrame html http ffmpeg org doxygen trunk
  • FFmpeg 缩放不是平滑中心(而是锯齿形)

    我尝试执行基本操作zoompan https www ffmpeg org ffmpeg all html zoompan with FFmpeg 我有一个输入图像 png 1280x720 并从中创建一个 8 秒的视频 mp4 320x1
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • 无法在 Eclipse 中运行 SDL 程序,但可以在 Windows 资源管理器中运行

    我已经安装并设置了 SDL 并设法获得了一个要构建的教程示例 教程代码来自http zamma co uk setup sdl2 eclipse windows http zamma co uk setup sdl2 eclipse win
  • 视频文件转换/转码 Google App Engine

    我想启动一个云计算项目 其简单任务是 接收上传的视频文件 对它们进行一些转码 转换 允许用户下载 流式传输生成的文件 我刚在想ffmpeg作为集成在的外部命令行工具Java Google App engine Application 由于很
  • 使用 mp4box 直播破折号内容

    我正在尝试直播H 264内容到HTML5使用媒体源扩展 API 下面的方法效果很好 ffmpeg i rtsp 10 50 1 29 media video1 vcodec copy f mp4 reset timestamps 1 mov
  • 如何创建媒体文件的稳定校验和?

    如何仅创建媒体数据的校验和而不包含元数据以获得媒体文件的稳定标识 最好是使用支持多种格式的库的跨平台方法 例如vlc ffmpeg 或 mplayer 媒体文件应该是常见格式的音频和视频 图像也很好 好吧 可能已经晚了 11 年才得到答案
  • 用PHP+FFMPEG生成随机缩略图

    我正在尝试使用 FFMPEG 和 FFMPEG PHP 扩展从电影中的随机点生成缩略图 我的脚本工作正常 但是需要 20 分钟才能生成 5 10 个缩略图 该脚本通过生成随机数来工作 这些随机数稍后用作帧号 生成的所有数字均在电影帧数之内
  • 图像序列到视频质量[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我一直在尝试从一系列图像创建视频 当我使用建议的 ffmpeg 方法时 ffmpeg f image2 i image d jpg video mpg
  • 使用 Java FFmpeg 包装器,还是简单地使用 Java 运行时来执行 FFmpeg?

    我对 Java 还很陌生 需要编写一个程序来监听视频转换指令 并在新指令到达时转换视频 说明存储在 Amazon SQS 中 但这与我的问题无关 我面临一个选择 要么使用 Java 运行时来执行 FFmpeg 转换 如从命令行 要么使用用

随机推荐

  • 二.centos7和主机实现xftp传文件,包含解决一些主机虚拟机互联的问题

    首先打开安装好的centos7 一 需要获取的信息 虚拟机 ifconfig 信息 主要是ensxx的信息 主机 ipconfig 信息 主要是vm8的信息 虚拟机点 编辑 虚拟网络编辑器 界面 查看虚拟机右下是否连接 点虚拟机右上角 看有
  • Nacos启动: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptionTable nacos_config.config_inf

    把nacos 1 1 4 server下载到本地之后 然后直接在bin目录下启动startup cmd报错 本地Mysql版本 5 6 44 nacos server版本 1 1 4 我找了很多解决办法 更多的说的是nacos自带的mysq
  • vue 实时往数组里追加数据

    使用Vue set 以下来解读一下 Vue set this tableDatas this selected obj 1 this tableDatas是我们声明好的数组 以下是自定义数据 tableDatas id 1 caseName
  • Python之数据分析(三维立体图像、极坐标系、半对数坐标)

    文章目录 写在前面 一 三维立体图像 1 三维线框 2 三维曲面 3 三维散点 二 极坐标系 三 半对数坐标 写在前面 import numpy as np import matplotlib pylab as mp 因此文章中的np就代表
  • Linux学习大纲

  • 以太网设计FAQ:以太网MAC和PHY

    问 如何实现单片 以太网 微控制器 答 诀窍是将微控制器 以太网媒体接入控制器 MAC 和物理接口收发器 PHY 整合进同一芯片 这样能去掉许多外接元器件 这种方案可使MAC和PHY实现很好的匹配 同时还可减小引脚数 缩小芯片面积 单片以太
  • MySQL第一讲 一遍让你彻底掌握MVCC多版本并发控制机制原理

    Mysql在可重复读隔离级别下 同样的sql查询语句在一个事务里多次执行查询结果相同 就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果 这个隔离性就是靠MVCC Multi Version Concurrency Contro
  • Python爬虫入门8:BeautifulSoup获取html标签相关属性

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 引言 在上节 https blog csdn net LaoYuanPython article details 113091721 Pyth
  • 【神经网络搜索】DARTS: Differentiable Architecture Search

    GiantPandaCV DARTS将离散的搜索空间松弛 从而可以用梯度的方式进行优化 从而求解神经网络搜索问题 本文首发于GiantPandaCV 未经允许 不得转载 1 简介 此论文之前的NAS大部分都是使用强化学习或者进化算法等在离散
  • io回顾

    package test import java io 读取一个文件 并打印在控制台上 class FileReaderTest public static void main String args throws IOException
  • Golang 项目部署实战

    一直认为不懂部署的开发工程师不是好的开发工程师 以下以一些实例讲解自己在项目中的 Golang 后端部署的情况 一般部署脚本应该具有构建 启动 停止 回滚已经查看记录日志等功能 以下分别将这些功能以单个脚本的形式给出 当然也可以写成Make
  • 数学建模算法体系分类

    数学建模算法体系 数据预处理模型 插值拟合 插值 拉格朗日插值法 分段线性插值 牛顿插值 埃尔米特 Hermite 插值 三次样条插值 n维数据插值 拟合 最小二乘法 评价 拟合工具箱 主成分分析 聚类分析 均值 方差分析 协方差分析等统计
  • 基于STM32的智能泊车系统

    一 前言 想起第一次参加的电子设计校赛好像在昨天一样 虽然确实在昨天 但是为了纪念这一段时间的劳动 并且记录一下遇到的问题 所以写了这篇文章 二 实现思路 通过手机向停车场发送停车请求 然后停车场通过判断车位是否为空 控制继电器打开相应的电
  • asp.net zero 8.2 学习-4-创建接口及服务

    上一节 在框架添加了实体 这一节 写接口及服务类 实现实体的增删改查 创建接口 SIS Application Shared层 创建DTO SIS Application Shared层 对应的Dto文件夹 创建Dto映射Mapper SI
  • vue-el-admin 使用?

    一 搭建 下载 启动 下载地址 panjiachen vue el admin Gitee com 共两个版本 vue element admin 完善版 vue admin template 极简版 启动 node js切换版本到16及以
  • STM32——端口复用与重映射

    目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例 串口1 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 AFIO时钟 开启AFIO情况 重映射端口
  • 用户注册及登录测试用例小记

    用户注册及登录测试用例
  • 更换PostgreSQL的data并重启服务

    更换 PostgreSQL 的 data 文件夹并重新启动 PostgreSQL 服务 适应场景 系统崩溃 需要恢复 PostgreSQL 数据及服务 平时可用的一种 PostgreSQL 备份 还原手段 操作步骤 导出 PostgreSQ
  • @SpringBootApplication注解学习

    SpringBootApplication 组合注解 具有多个注解功能 SpringBootConfiguration Documented 表明这个注解应该被 javadoc工具记录 没什么用 Configuration 表示当前类可以看
  • (ffmpeg)ffmpeg+SDL的简单播放器(雷霄骅)更新版

    代码源自雷神 一个是播放音频的demo 可以播放MP3和AAC 但是MP3应该是没有封面的 另一个是播放ts格式的视频 没有声音 源码可以到雷神博客下载 但是因为ffmpeg库的更新问题 并不能直接在ubuntu下直接运行 笔者做了修改 在