FFmpeg-安装及基本概念
FFmpeg-命令
FFmpeg-demo源码地址
这里记录通过 C语言 操作FFmpeg对多媒体文件的处理
Log
常用日志级别(级别由高到底排列)
1.AV_LOFG_ERROR
2.AV_LOG_WARNING
3.AV_LOG_INFO
启用步骤
1 | include <libavutil/log.h> |
1 | ➜ FFmpeg-demo git:(master) clang -g -o ffmpeg_log ffmpeg_log.c -lavutil |
文件的删除&重命名
avpriv_io_move("111.txt","222.txt");
重命名avpriv_io_delete("./mytestfile.txt");
删除
1 | ➜ FFmpeg-demo git:(master) ✗ clang -g -o ffmpeg_del ffmpeg_file.c `pkg-config --libs libavformat` |
操作目录
avio_open_dir
avio_read_dir
avio_free_directory_entry
avio_close_dir
1 | av_log(NULL, AV_LOG_INFO, "%12"PRId64"%s \n",entry->size,entry->name); |
1 | ➜ FFmpeg-demo git:(master) ✗ clang -g -o list ffmpeg_list.c `pkg-config --libs libavformat libavutil` |
打印音视频meta信息
av_register_all
avformat_open_input
av_dump_format(fmt_ctx, 0, "./test.mp4", 0/**输入信息*/);
输入信息 填0
输入信息 填1
avformat_close_input
1 | ➜ FFmpeg-demo git:(master) ✗ clang -g -o mediainfo mediainfo.c `pkg-config --libs libavutil libavformat` |
抽取多媒体中的音频数据
av_init_packet(&pkt);
av_find_best_stream
av_read_frame/av_packet_unref
1 | clang -g -o extr_audio extr_audio.c `pkg-config --libs libavutil libavformat` |
抽取多媒体中的H264视频数据
先要知道的三点:
1.将多媒体中的H264视频数据抽取后,它其实是由一帧一帧压缩后的视频帧组成的,如何区分这一帧一帧的视频帧呢?两种方法:
- 在每一帧的长度前面加一个真的长度,当读取第一帧的时候先读取这一帧的长度,根据这一帧的长度在读取帧的数据长度,依次下去。。。
- 在每一帧的前面加关键字(特征码),只要遇到特征码就知道这一帧开始了,上一帧结束了。
2.SPS/PPS(它只有几个字节,不会增加网络负担)
解码的视频参数,以及视频帧的宽高(也就是常说的视频分辨率),等等都是存在于SPS/PPS。
视频播放时,每次切换分辨率都要更新SPS/PPS。
而在视频直播时,在每个关键帧里面都会有一个SPS/PPS。
3.ffmpeg如何获取SPS/PPS?
codec->extradata
1 | clang -g -o extr_video extr_video.c `pkg-config --libs libavutil libavformat` |
mp4转flv
1 | avformat_alloc_output_context2/avformat_free_context |
1 | clang -g -o remuxing remuxing.c `pkg-config --libs libavformat` |
音视频裁剪
av_seek_frame
1 | clang -g -o cutvideo cutvideo.c `pkg-config --libs libavformat libavcodec` |
FFmpeg编解码概括
类型:
- H264解码
- H264编码
- AAC解码
- AAC编码
用到的头文件:
- libavcodec/avcodec.h
用到的结构体:
- AVCodec编解码结构体
- AVCodecContext 编解码器上下文
- AVFrame 解码后的帧
结构体内存的分配和释放API:
- av_frame_alloc/av_frame_free()
- avcodec_alloc_context3()
- avcodec_free_context()
解码步骤:
avcodec_find_decoder
查找解码器avcodec_open2
打开解码器avcodec_decode_video2
解码,得到RGB或者YUV数据
H264编码
步骤:
avcodec_find_encoder_by_name
查看编码器avcodec_open2
设置编码参数,并打开编码器avcodec_encode_video2
编码
1 | ➜ FFmpeg-demo git:(master) ✗ clang -g -o encode_video encode_video.c `pkg-config --libs libavcodec` |
视频转图片
1 | ➜ FFmpeg-demo git:(master) ✗ clang -g -o decode_video decode_video.c `pkg-config --libs libavformat libavutil libavcodec libswscale` |
AAC编码
avcodec_encodec_audio2
1 | clang -g -o encode_audio encode_audio.c `pkg-config --libs libavcodec` |