//打开一个封装文件
avformat_open_input(&fmt_ctx, input_filename, NULL, NULL);
//获得封装文件的streamer流信息
avformat_find_stream_info(fmt_ctx, NULL);
//获得封装文件中音频或者视频流的id号
av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
//获得音频或视频的codec
pCodecCtx = pFormatCtx->streams[0]->codec;
pCodec = avcodec_find_decoder(pCodecCtx->codec_id); /
origin_par = fmt_ctx->streams[video_stream]->codecpar;
codec = avcodec_find_decoder(origin_par->codec_id);
avcodec_find_encoder(AV_CODEC_ID_FLAC);
//打开codec
avcodec_open2(pCodecCtx, pCodec, NULL);
//根据AVCodec创建AVCodecContext
AVCodecContext* ctx = avcodec_alloc_context3((AVCodec*)enc);
//申请一帧画面的大小
byte_buffer_size = av_image_get_buffer_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, 16);
byte_buffer = av_malloc(byte_buffer_size);
//申请音频的大小
byte_buffer_size = av_samples_get_buffer_size(NULL, pCodecCtx->channels, pCodecCtx->sample_rate, pCodecCtx->sample_fmt, 1);
//读取封装文件里的一包数据
av_read_frame(pFormatCtx, &rd_packet);
保存此一包数据(比如h264压缩数据)
fwrite(rd_packet.data, 1, rd_packet.size, video_fp);
//AVPAcket/AVFrame的申请以及初始化操作
av_init_packet(&pkt);
fr = av_frame_alloc();
//解码成yuv的AVFrame
avcodec_decode_video2(ctx, fr, &got_frame, &pkt);
//将AVFrame结构体保存的一帧yuv数据转换成unsigned char*
number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, (const uint8_t* const *)fr->data, (const int*) fr->linesize, ctx->pix_fmt, ctx->width, ctx->height, 1);/
out_frame_bytes = out_frame->nb_samples * out_frame->channels * sizeof(uint16_t);
memcpy(raw_out + out_offset, out_frame->data[0], out_frame_bytes);
out_offset += out_frame_bytes;
//AVFrame中buffer分配的两种方式(只是分配空间)
msg.frame->format = AV_PIX_FMT_RGBA;
msg.frame->width = 320;
msg.frame->height = 240;
ret = av_frame_get_buffer(msg.frame, 32); //int av_frame_get_buffer(AVFrame *frame, int align);
av_frame_get_buffer(in_frame, 32);
int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align);
out_frame = av_frame_alloc();
avcodec_encode_audio2(enc_ctx, &enc_pkt, in_frame, &got_output); //编码
avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt); //解码
//线程相关
av_thread_message_queue_send(wd->queue, &msg, 0);
av_thread_message_queue_recv(rd->queue, &msg, 0);
//FFmpeg进行H.264编码
yuv->pts = vpts;
vpts++;
avcodec_send_frame(vc, yuv);
avcodec_receive_packet(vc, &pack);
//FFmpeg进行视频格式封装和推流
pack.pts = av_rescale_q(pack.pts, vc->time_base, vs->time_base);
pack.dts = av_rescale_q(pack.dts, vc->time_base, vs->time_base);
pack.duration = av_rescale_q(pack.duration, vc->time_base, vs->time_base);
//像素格式转换
sws_getCachedContext()
sws_scale()
///////////////////////////////////////实例介绍////////////////////////////////////////////////////////////
https://linux.cn/article-10932-1.html
//封装格式变换:
ffmpeg -i z.flv -strict -2 z.mp4
ffmpeg -i z.flv -qscale 0 -strict -2 z.avi //-qscale 0 维持你的源视频文件的质量
//视频封装文件保存为音频文件
ffmpeg -i z.flv -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3
ffmpeg -i z.flv -vn(禁止视频) -ar 44100(采样率) -ac(通道数) 2 -ab(比特率) 320 -f(输出文件格式) mp3 output.mp3
//更改视频文件的分辨率
ffmpeg -i z.mp4 -filter:v scale=1280:720 -c:a copy output.mp4
ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4
ffmpeg -i z.mp4 -filter:v(视频过滤器) scale(拉伸过滤器)=1280:720 -c:a copy output.mp4
ffmpeg -i input.mp4 -s(尺寸裁剪) 1280x720 -c:a copy output.mp4
//压缩视频文件
//压缩音频文件(减少通道数,采样率,比特率等)
ffmpeg -i input.mp3 -ab 128 output.mp3
//从封装文件中获取视频流
ffmpeg -i z.mp4 -an video.mp4
//从封装文件中获取音频流
ffmpeg -i z.mp4 -vn audio.mp4
ffmpeg -i z.mp4 -vn -ab 256 -ar 48000 audio.mp3
//从视频中提取图片
ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png
ffmpeg -i input.mp4 -r(每秒钟提取一张图片(视频30s,则会提取30张图片)) 1 -f image2 image-%2d.png
//裁剪视频
ffmpeg -i input.mp4 -filter:v crop=320:120:200:150 output.mp4
ffmpeg -i input.mp4 -filter:v(视频过滤器) "crop(裁剪过滤器)=w:h:x:y" output.mp4
//转换一个视频的具体的部分(比如从视频开始到指定时间转换为其它格式)
ffmpeg -i input.mp4 -t 10.10 output.avi
ffmpeg -i input.mp4 -t(从视频开始到10s10ms处保存为avi格式) 10.10 output.avi
//使用开始和停止时间剪下一段媒体文件
ffmpeg -i z.mp4 -ss 00:00:10 -codec copy -t 50 output.mp4
ffmpeg -i z.mp4 -ss 00:00:10 -codec copy -t 50 output.avi
//设置视频的屏幕高宽比
ffmpeg -i input.mp4 -aspect 16:9 output.mp4
ffmpeg -i input.mp4 -aspect(设置宽高比) 16:9 output.mp4
//添加海报图像到音频文件
ffmpeg -loop 1 -i image-15.png -i audio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v(指定视频编解码模块) libx264 -c:a((指定音频编解码模块)) aac -strict experimental -b:a(?) 192k -shortest output.mp4
//切分视频文件为多个部分
ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4 //-c 和 -codec 同一个效果
//接合或合并多个视频部分到一个
ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4
//添加字幕到一个视频文件
ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4
//增加/减少视频播放速度
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
//创建动画的 GIF
ffmpeg -ss 00:00:20 -i sample.mp4 -to 10 -r 10 -vf scale=200:-1 cutekid_cry.gif
本文详细介绍使用FFmpeg进行音视频处理的方法,包括音视频编解码、格式转换、流媒体处理、视频编辑及参数调整等内容。通过FFmpeg,可以实现音视频文件的压缩、解压缩、格式转换、质量调整、分辨率修改、音频提取、视频截图等功能。

2845

被折叠的 条评论
为什么被折叠?



