(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 提取帧的最快方法?

    您好 我需要使用 ffmpeg 从视频中提取帧 有没有比这更快的方法 ffmpeg i file mpg r 1 1 filename 03d jpg 如果 JPEG 编码步骤对性能要求太高 您可以始终将未压缩的帧存储为 BMP 图像 ff
  • 消除 ffmpeg 和 image-magic 命令中的慢速因素

    这些命令的基本思想是创建一个比较 比较定义了过去的一张 jpeg 和现在的一张 jpeg 组合起来 例如它们将相互滑动并显示前后图像 e g https media evercam io v1 cameras 1lowe scnoe com
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 在 Fedora 上安装 SDL

    我安装了 FEDORA 和 SDL 并希望在编译时用 C 语言对图形进行编程 我收到了很多对 SDL MapRGB SDL Init 等未定义的引用 我搜索了文件系统 SDL dll 丢失 如何解决这个问题呢 Linux不使用 dll文件来
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • Python 子进程(ffmpeg)仅在我按 Ctrl-C 程序时启动?

    我正在尝试使用 Cygwin 和 Python 2 7 并行运行一些 ffmpeg 命令 这大概是我所拥有的 import subprocess processes set commands ffmpeg i input mp4 outpu
  • 如何使用 ffmpeg 将两个视频/音频流混合为一个

    我有两个视频 v1 flv 和 v2 flv 想要创建 v3 flv 其中包含来自 v1 flv 的视频流以及来自 v1 flv 和 v2 flv 的 混合 音频流 使用 ffmpeg 命令可以实现类似的操作吗 谢谢 我认为使用 ffmpe
  • FFMPEG:使用具有复杂滤波器的视频滤波器

    我正在使用fluent ffmpeg用于对视频文件执行批量操作的 Node js 库 视频过滤器裁剪 16 9 输入 添加填充并将字幕刻录到填充中 在下一步中 我想使用复杂的滤镜来覆盖图像作为水印 ff input video mp4 ff
  • 两个图像之间的视频变形,FFMPEG/Minterpolate

    我正在尝试在 Ubuntu Linux 上的 bash 脚本中使用两个帧 png 图像 和 ffmpeg 的 minterpolate 过滤器制作一个快速且简单的变形视频 目的是稍后使用变形作为不同视频编辑器中相似视频之间的过渡 它适用于
  • Chromium 中的 MP4 编解码器支持

    我们已将 Chromium 嵌入式框架集成到我们的 Windows 游戏中 以允许我们从应用程序内渲染网页 并且一切正常 除了 MP4 视频 据我所知 由于许可问题 Chromium 不包含此编解码器 但任何人都可以提供有关我们如何添加支持
  • 如何在服务器上使用 ffmpeg 从 WebRTC 流获取音频和视频

    我正在尝试从 WebRTC 流获取音频和视频 并在 ubuntu 服务器上使用 ffmpeg 处理它 转码或转储 我天真地期望它能简单地解释 WebRTC 提供的 sdp 但我错了 我怀疑 ffmpeg 无法发回答案 sdp 必须手动完成
  • 如何使用 ffmpeg 设置默认流

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

    我只是尝试使用 Xuggler 将 mov 文件转换为 webm 这应该可以工作 因为 FFMPEG 支持 webm 文件 这是我的代码 IMediaReader reader ToolFactory makeReader home use
  • ffmpeg 配置复杂过滤器时出错

    ffmpeg 命令存在一些问题 也许有人可以指出我正确的方向 我使用此链接来构建我的命令 那么问题 https stackoverflow com questions 7333232 how to concatenate two mp4 f
  • 无法从 webm 视频中提取 webp 中的帧

    我无法从 8K webp 视频中提取帧 我正在使用 ffmpeg 来提取帧 这是我正在使用的命令 ffmpeg i content to extract webm frame 2d webp 我得到的输出文件中没有任何数据 但是 当我导出为
  • ffmpeg计算视频比特率

    我想知道如何计算该视频的比特率 http jell yfish us media jellyfish 30 mbps hd hevc mkv http jell yfish us media jellyfish 30 mbps hd hev
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 为 Android 编译时显示 FFMPEG 错误

    我正在尝试将 ffmpeg 添加到我的 android 项目中 我使用的是 ubuntu 14 04 操作系统 我正在关注此链接 Link https software intel com en us android blogs 2013
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传

随机推荐

  • 二.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下直接运行 笔者做了修改 在