# 音视频编解码 **Repository Path**: qiao08/audio_video_codec ## Basic Information - **Project Name**: 音视频编解码 - **Description**: mp4, mkv, ts, hevc, h264, mpeg4, mpeg2, mp3, aac, 编解码相关介绍。 - **Primary Language**: C - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 35 - **Created**: 2023-10-10 - **Last Updated**: 2023-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 音视频编解码知识介绍 |作者|将狼才鲸| |---|---| |日期|2021-06-02| 本文档CSDN地址:[音视频格式简介、编解码、音视频同步](https://blog.csdn.net/qq582880551/article/details/117481858)
本文档Gitee: [ 才鲸/音视频编解码](https://gitee.com/langcai1943/audio_video_codec/blob/develop/2_ffmpeg%E6%9E%B6%E6%9E%84.md)
本文档配套哔哩哔哩视频地址(待完成):[才鲸嵌入式](https://space.bilibili.com/106424039)
--- * 通用的、常用的、最稳定的编解码是开源的FFmpeg,本仓库中的src/ffmpeg文件夹中源码带有注释,方便初学者进行阅读。 * 本仓库doc/文件夹下有音视频各种格式的中英文规范文档,很多在网上都下不到了。 ## 整体介绍 * ffmpeg的几个简单应用ffprobe、ffmpeg、ffplay的功能介绍,和libav库的介绍见作者CSDN文章: [《FFMPEG使用、源码框架、架构解析》](https://blog.csdn.net/qq582880551/article/details/119687558) * ffmpeg源码结构分析见作者CSDN文章: [《FFMPEG架构简单分析》](https://blog.csdn.net/qq582880551/article/details/119686735) 原始文档源码路径: [ffmpeg源码架构](https://gitee.com/langcai1943/audio_video_codec/blob/develop/2_ffmpeg%E6%9E%B6%E6%9E%84.md)
# 音视频格式简介 1. 文件格式 * .mkv
一种容器和文件格式,和AVI MP4 ASF类似
[matroska官网](https://matroska.org/index.html "matroska")
[协议pdf下载地址](https://matroska.org/files/matroska_file_format_alexander_noe.pdf "matroska") * .mp4
一种容器格式,全名MPEG-4第14部分,协议ISO/IEC 14496-14:2003
[mpeg官网](https://mpeg.chiariglione.org/ "mpeg") (速度很慢,无法下载协议文档)
[协议pdf下载地址](http://www.elecfans.com/soft/162/2008/200808267573.html "elecfans") 注册以后即可下载,无需下载积分
[苹果原始QuicTime协议地址](https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html)
* .mp3
一种音频编码与压缩格式,全称MPEG-1 or MPEG-2 Audio Layer III,ISO/IEC 13818-3 or ISO/IEC 11172-3
[CSDN下载地址](https://download.csdn.net/download/screwshine/3816094 "csdn") 需要下载积分 * .jpg/.jpeg
JFIF格式的文件,JPEG压缩方法,协议ISO/IEC 10918-1
[协议pdf下载地址](https://www.w3.org/Graphics/JPEG/itu-t81.pdf "ITU T.81") 官网免费下载
[CSDN下载地址](https://download.csdn.net/download/mybear0706/7075151 "csdn") 需要下载积分(与上面的文件一致) * .mjpg/.mjpeg
格式[RFC 2435](https://tools.ietf.org/html/rfc2435)
ITU T.81 [在线阅读](https://wenku.baidu.com/view/f4429ac24028915f804dc27d.html "百度文库")
下载地址见前面.jpeg 2. 编码格式 * mp3
MPEG-1 or MPEG-2 Audio Layer III
ISO/IEC 13818-3 or ISO/IEC 11172-3
协议下载地址见前面.mp3 * aac
AAC由国际标准化组织及国际电工委员会标准化为MPEG-2及MPEG-4规格的一部分。
.aac使用MPEG-2 Audio Transport Stream容器
MPEG-2 AAC和MPEG-4 AAC
ISO/IEC 13818-7 or ISO/IEC 14496-3 (HE-AAC/aac+)
[13818-7下载地址](https://download.csdn.net/download/sinat_15012787/12237536 "csdn") 需要下载积分
[14496-3下载地址](https://download.csdn.net/download/jgf_ntu/4683782 "csdn") 需要下载积分
* h264
全称MPEG-4 Part 10, Advanced Video Coding,ISO/IEC 14496-10:2004
[协议pdf下载地址](https://www.itu.int/rec/T-REC-H.264-201906-I/en "ITU下载地址") 下载速度很慢,但是可以下载成功 * hevc/h265 * mpeg4 * mpeg2
ISO/IEC 13818-1 音视频同步与复用 [13818-1中文版下载地址](https://download.csdn.net/download/louisneon/2752485 "csdn") 需要下载积分
ISO/IEC 13818-2 视频
[138181~3中文版下载地址](http://download.eeworld.com.cn/detail/solarelec/100059 "eeworld") 需要一个下载积分
[13818-2英文版下载地址](https://download.csdn.net/download/michaelkuo8088/531610 "csdn") 需要下载积分
* jpeg
协议ISO/IEC 10918-1 or ITU T.81
下载地址见前面.jpeg 3. 开源编解码器 * ffmpeg
[官网](https://ffmpeg.org/ffmpeg.html "ffmpeg")
[Git仓库](https://github.com/FFmpeg/FFmpeg "FFmpeg")
[WiKi](https://trac.ffmpeg.org/ "ffmpeg")
压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
* bilibili网页播放器
flv.js [Github仓库](https://github.com/bilibili/flv.js.git "flv.js") * bilibili苹果安卓播放器
ijkplayer [Github仓库](https://github.com/bilibili/ijkplayer "ijkplayer") * ffserver
ffserver [wiki地址](https://trac.ffmpeg.org/wiki/ffserver "ffserver") * ffplay
ffplay [官网](https://ffmpeg.org/ffplay.html "ffplay")
使用the FFmpeg libraries and the SDL library。
MediaInfo查看媒体文件信息 [官网](https://mediaarea.net/en/MediaInfo "mediaarea")
[源码](https://sourceforge.net/projects/mediainfo/ "sourceforge")
4. 参考资料
[如何用ffplay播放视频](https://askubuntu.com/questions/750754/how-to-play-video-using-ffmpeg-on-ubuntu)
[ISO/IEC 14496-12:2015(ISO格式) ](https://standards.iso.org/ittf/PubliclyAvailableStandards/c068960_ISO_IEC_14496-12_2015.zip "官网") 官网可免费下载
[ffplay read_thread获取文件信息流程](https://blog.csdn.net/oncealong/article/details/91400671 "csdn")
[ffplay avformat_open_input解封装流程](https://blog.csdn.net/leixiaohua1020/article/details/44064715 "avformat_open_input")
[ffplay probe探测文件格式流程](https://blog.csdn.net/jyt0551/article/details/77018293 "csdn")
[mp4文件格式详解](https://blog.csdn.net/DONGHONGBAI/article/details/84401397 "csdn")
[mkv文件格式详解](https://blog.csdn.net/tx3344/article/details/8162656 "csdn")
[ffplay 视频显示流程](https://blog.csdn.net/dssxk/article/details/50403018 "csdn")
5. ffplay源码分析
```c // 获取文件封装格式 main() --> stream_open() --> read_thread() --> avformat_open_input() --> init_input() --> av_probe_input_buffer2() --> av_probe_input_format2() --> av_probe_input_format3() --> for(){ score = fmt1->read_probe() } // 选出封装格式,如mp4、mkv // AVInputFormat *fmt1 // mp4的read_probe() 是 mov_probe() ``` ```c // 解封装,获取基础的流信息 main() --> stream_open() --> read_thread() --> avformat_open_input() --> s->iformat->read_header(s) // 获取基本的流信息,如有多少音频和视频,音视频是什么格式 // mp4的read_header() 是 mov_read_header() ``` ```c // 获取流里面的帧 --> ff_read_packet() --> s->iformat->read_packet(s, pkt) // mp4的read_packet() 是 mov_read_packet() ``` ```c // 解码 AVCodec *codec video_thread() --> get_video_frame() --> decoder_decode_frame() --> packet_queue_get() --> avcodec_receive_frame() --> decode_receive_frame_internal() --> decode_simple_receive_frame() --> decode_simple_internal() --> avctx->codec->decode() ffmpeg/libavcodec/mpegaudiodec_float.c decode_frame() ffmpeg/libavcodec/h264dec.c h264_decode_frame() ``` ```c // 文件操作 //最终的读数据接口 url.h URLProtocol 将数据读到 AVIOContext main() --> stream_open() --> read_thread() --> avformat_alloc_context() --> avformat_get_context_defaults() --> io_open_default() --> ffio_open_whitelist() --> ffurl_open_whitelist() --> ffurl_connect() --> uc->prot->url_open() //实际调用的地方是: read_thread() --> avformat_open_input() --> init_input() --> s->io_open() //读取的数据放到AVIOContext中的buffer中 url_open = file_open, //file.c ffurl_read() ffio_geturlcontext() AVIOContext中read_packet() ``` ```c //数据流通过程 read_probe(AVProbeData.buf) <-- avio_read(AVIOContext.buf_ptr, 2k) <-- AVFormatContext.pb ``` ```c //h264 hevc转码 main() --> transcode() --> transcode_step() --> process_input() --> process_input_packet() --> do_streamcopy() --> output_packet() --> write_packet() --> av_interleaved_write_frame() --> write_packets_common() --> write_packet_common() --> write_packet() --> ff_raw_write_packet() --> avio_write() --> memcpy() //mpeg4转码 main() --> transcode() --> transcode_step() --> process_input() --> process_input_packet() --> decode_video --> decode --> avcodec_send_packet --> avcodec_receive_frame --> av_bsf_send_packet main() --> transcode() --> transcode_step() --> reap_filters -->av_buffersink_get_frame_flags --> get_frame_internal --> ff_inlink_consume_frame --> ff_framequeue_take (从队列里取出帧FFFrameQueue AVFilterLink AVFilterContex->inputs[0] OutputStream output_streams) //--> return_or_keep_frame --> av_frame_ref //--> do_video_out --> avcodec_send_frame --> do_encode //--> do_video_out--> avcodec_receive_packet --> av_packet_move_ref 执行完之后得到mpeg4视频流 ``` 6. 额外的网页资料
[mp4数据流结构 《[音视频]mp4相比m3u8第一帧加载较慢的原因?》](https://www.jianshu.com/p/0f1fc8fc2278)
[mp4大部分box详细介绍《mp4封装格式各box类型讲解及IBP帧计算》](https://www.cnblogs.com/ailumiyana/p/12907363.html)
[mkv大部分element详细介绍 《【多媒体封装格式详解】---MKV》cluster/block ](https://www.cnblogs.com/jingzhishen/p/3833402.html)
[《H.264编码格式简单分析》]( https://www.cnblogs.com/jiayayao/p/7086711.html)
[《【H264/AVC 句法和语义详解】(二):h264码流格式与NALU详解一》 ](https://msd.misuland.com/pd/3065794831805579300)
[《H264码流和Mp4结构详解》](https://blog.csdn.net/qq_36449541/article/details/81485022)
[《H.264码流结构解析》](https://blog.csdn.net/zhuyunier/article/details/79613263)
[《H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流》](https://www.xuebuyuan.com/1695615.html)
[《MP4中提取H.264码流》](https://blog.csdn.net/xiaojun111111/article/details/52135209)
[《【VS开发】MP4与H.264》](https://www.cnblogs.com/huty/p/8518876.html)
[《用ffmpeg从MP4中提取h.264码流》](https://blog.csdn.net/strikedragon/article/details/90108067)
[《H264(NAL简介与I帧判断)》](https://www.cnblogs.com/yjg2014/p/6144977.html)
[《区分mp4格式里面mdat中的音频和视频数据》](https://blog.csdn.net/u013898698/article/details/77337597)
[《MP4 mdat box解析》](https://blog.csdn.net/u013752202/article/details/80557222)
[测试视频下载 ](http://www.rapconverter.com/sample-videos)
[《Mpeg MP4 Container》](https://www.ramugedia.com/mp4-container)
[《mp4所有box详解》](https://wiki.multimedia.cx/index.php/QuickTime_container#mdat)
[《H264码流详细说明》](https://blog.csdn.net/heibao111728/article/details/80354630)
[《H264码流分析》](https://blog.csdn.net/qq_18998145/article/details/99832401)
[AAC 音频格式详解](https://blog.csdn.net/sdsszk/article/details/83997348)
[【多媒体封装格式详解】---MP4【4】](https://www.cnblogs.com/lidabo/p/3754130.html)
[mp4文件格式解析](https://www.jianshu.com/p/529c3729f357)
[ffmpeg命令大全 (保存流)](https://blog.csdn.net/walkeryudev/article/details/94623129)
[Matroska文件解析之SimpleBlock](https://blog.csdn.net/zhangrui_fslib_org/article/details/50758837)
[FFmpeg简易播放器的实现5-音视频同步](https://www.cnblogs.com/leisure_chn/p/10284653.html)
[FFmpeg图解:结构体关系链接图](https://blog.csdn.net/bangdingshouji/article/details/70053658)
[【FFMPEG】关于硬解码和软解码](https://www.cnblogs.com/chenpingzhao/p/12359725.html)
[FFmpeg硬件解码-HWAccelIntro](https://www.pianshen.com/article/2418411527/)
7. ffmpeg源码分析 ```c //打开文件 main() --> ffmpeg_parse_options() --> open_files() --> --> open_input_file() --> avformat_open_input() --> AVFormatContext *ic //处理流 --> choose_decoder() --> avformat_find_stream_info() --> add_input_streams() --> transcode() --> transcode_step() --> transcode_step() --> transcode_from_filter() ``` 8. 音视频同步 [关于音视频同步 ffplay的同步方式解析](https://blog.csdn.net/u014616531/article/details/51720628)
[如何实现音视频同步 (live555)](https://www.jianshu.com/p/8d2463804ba4)
[播放器技术分享(3):音画同步](https://blog.csdn.net/weixin_34360651/article/details/85075809)
[音视频同步原理及实现](https://blog.csdn.net/myvest/article/details/97416415)
[即时通讯——详解音视频同步技术](https://www.cnblogs.com/x_wukong/p/5876645.html)
[音视频同步(播放)原理](https://blog.csdn.net/u014162133/article/details/82462765)
[WebRTC音视频同步详解 ](https://my.oschina.net/u/4312833/blog/4405326)
[视频解码研究之PTS(2)Mp4格式,AVI格式和MKV格式]( https://blog.csdn.net/qq_32430349/article/details/50363375)
[视频解码研究之PTS(1)TS格式和FLV格式]( https://blog.csdn.net/qq_32430349/article/details/50218317)
[TS流的PCR PTS DTS时间戳计算](https://www.cnblogs.com/Dreaming-in-Gottingen/p/13943202.html)
[mkv block解析](https://blog.csdn.net/yu_yuan_1314/article/details/9626741?utm_source=blogxgwz7) [如何在H264数据中获取PTS](https://blog.csdn.net/u013898698/article/details/86596297) mp4 mdat中存储的视频帧顺序不是按显示顺序存放的,是按解码顺序放的!但是要用elecardstreameyetools工具分析h264流文件才能看出来,普通的工具不行!然后能够看出ctts的值是对的,因为ctts的值不能为负数,所以第一个ctts值是整体的偏移值! 9. dts/pts在mp4文件的获取 ```c mov.c //dts的计算 mov_read_packet() --> dts = timestamp; mov_read_trak() --> mov_build_index() --> timestamp = current_dts{in stsc box}; current_dts += stts_data.duration{in stts box} --> //需要调整的时候--> mov_fix_index() --> add_index_entry() ``` ```c //pts的计算 //没有b帧时 pts = dts //有b帧时 pts = dts + dts_shift + ctts_data.duration; dts_shift: mov_update_dts_shift() --> ctts_duration{ctts box存放dts pts差值} ``` 10. 音视频同步流程 ```c /* 音频播放流程 */ ffplay.c main() --> stream_open() --> read_thread() --> stream_component_open() --> audio_open() --> sdl_audio_callback() --> SDL_OpenAudioDevice() --> SDL_PauseAudioDevice() ``` ```c /* 视频播放流程 */ main() --> event_loop() --> refresh_loop_wait_event() --> video_refresh() --> video_display() --> video_image_display() ``` 11. 音视频同步的时间轴获取流程 ```c mov.c mp4解封装获取pkt->pts decode.c ff_decode_frame_props() frame->pts = pkt->pts; decoder_decode_frame() --> 音频:frame->pts //这里的frame->pts和原始的mov.c中mp4的pkt->pts一致 视频:frame->pts //获取Frame中af->pts(float,以秒为单位) audio_thread() or video_thread()--> af->pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb); //从累计数据量转换为时间轴实际秒数 //获取VideoState中的audio_clock //===================== struct Frame --> double af->pts; double duration; //实测为当前帧从0开始的相对秒数 audio_decode_frame() --> struct VideoState --> double audio_clock; //实测为从零开始,当前帧播完时的相对秒数(浮点型,精确到毫秒) is->audio_clock = af->pts + (double) af->frame->nb_samples / af->frame->sample_rate; //l2493 调整时间轴时间 //获取Clock中的pts //====================== sdl_audio_callback() --> set_clock_at(&is->audclk, ...) --> Clock audclk; --> .pts --> get form "is->audio_clock" ``` 12. 使用ffmepg中的libavcodec编解码库,解封装自己做,解码mpeg1视频流的官方例子 [decode_video.c](http://ffmpeg.org/doxygen/4.1/decode_video_8c-example.html) [decode_audio.c](http://ffmpeg.org/doxygen/4.1/decode_audio_8c-example.html) 13. 使用sdl2 api,自己播放音视频的官方用例 (官方的示例不太实用,还是百度上的示例有用) [Playing Sounds](http://lazyfoo.net/SDL_tutorials/lesson11/index.php) 14. 一些FFMPEG转码命令 **ffmpeg mp4转pcm,播放PCM** ``` ffmpeg -i 1.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm ffplay -ac 2 -ar 44100 -f s16le out.pcm ``` **ffmpeg mkv转mp4** ``` ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4 ``` **ffmpeg 转mpeg2 mpeg4纯视频流** ``` 转mpeg4 mpeg2: -vcodec mpeg4, -vcodec mpeg2video 如ffmpeg -i in.mp4 -vcodec mpeg2video out.m2v(能直接被Mali或其它解码器播放) 转码其它: -c:v copy out.m2v/m4v/h264/hevc/mpeg 【注意!】要生成纯mpeg4视频流文件,需要先./configure --disable-muxer=ipod 再make,取消掉ffmpeg的ipod m4v格式,这个格式实际上是mp4 然后ffmpeg -i input.mp4 output.m4v 直接ffmpeg -i in.mp4 -vcodec mpeg4 mpeg4.mp4生成的mpeg4.mp4将packet直接拷贝成.m4v文件并不能播放 而用ffmpeg -i mkv.mkv -i in.mp4 -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 match_m4v.mp4生成的mp4文件才将视频流直接拷贝成.m4v后能播放 生成m4v文件时需要指定编码器-vcodec mpeg4,直接copy不能播放 ``` **将一个文件中的视频部分,和另一个文件中的音频部分合成一个文件:** ``` ffmpeg -i s720-128_96-44100_2.mp4 -i a11025.aac -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output.mp4 ffmpeg -i 128_96_44100-movie.mp4 -i ShenTouNaiBa3.mp4 -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 movie_test1.mp4 ffmpeg have not libxh264 and libmp3lame ``` **压缩音视频** ``` -s 320*240 -ar 44100 -ac 1 or 2 ``` **将mp4 MDAT数据段放到mp4文件开头** ``` -movflags faststart ``` **Download SDL2-2.0.4.rar in csdn ffplay使用sdl2播放音视频** ``` ./configure; make; and make install or can install libsdl2-dev The ffplay can't play video: make clean; change -lW to -lSDL2 in EXTRALIBS of ffbuild/config.mak Use media codes, add -L/usr/lib/i386-linux-gnu -lSDL2 in line 120 of scripts/gcclink.sh ``` **ffmpeg转码成yuv:** ``` ffmpeg -i ~/video_files/s320.mp4 -s 640*480 -pix_fmt yuv420p out.yuv ffplay -video_size 640*480 -i out.yuv ``` **从某一时间开始截取一定长度音视频** ``` -ss 7 -t 1 //从第7秒开始截取1s ``` **录制** ``` windows==== 查看支持的设备 ffmpeg -list_devices true -f dshow -i dummy 录音 ffmpeg -f dshow -i audio="麦克风 (VIA HD Audio(Win8))" -acodec libmp3lame window.mp3 录像 ffmpeg -f dshow -i video="ASUS USB2.0 Webcam" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mp4 录制音视频 ffmpeg -f dshow -i video="ASUS USB2.0 Webcam" -f dshow -i audio="麦克风 (VIA HD Audio(Win8))" -vcodec libx264 -acodec libmp3lame -r 15 temp.mkv Linux==== record screen ffmpeg -f x11grab -r 30 -i :0.0 -f alsa -i hw:0,0 -acodec flac -vcodec ffvhuff out.mkv record audio ffmpeg -f alsa -ac 2 -i hw:0,0 out.avi record video and audio ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+0,0 -f alsa -ac 2 -i pulse -acodec aac -strict experimental output.mp4 ./ffmpeg -video_size 800x600 -framerate 25 -f x11grab -i :0.0+0,0 -f alsa -ac 2 -i pulse -acodec aac -strict experimental output.mp4 alsa - palseaudio: linux audio library x11grab ``` ffmpeg命令处理时默认使用软解码器,要使用硬件显卡加速的话: 查看gpu: ffmpeg -hwaccels 使用一款视频VPU加速,如: ffmpeg -hwaccel qsv -i 输入文件名 输出文件名 转码时设置码率: -b:v 10M **ffmpeg转pcm命令** ``` ffmpeg -i roar.wav -acodec pcm_s16le -f s16le -ac 2 -ar 16000 out.pcm ffplay -ar 16000 -ac 2 -f s16le -i out.pcm ``` **ffmpeg 提取mp4中的h264视频流命令** ``` ffmpeg -i test.mp4 -c:v copy -bsf: h264_mp4toannexb -f h264 test.h264 ``` --- 15. FFmpeg使用硬件编解码器 * 使用ffmpeg -codecs命令查看支持的所有软件和硬件编解码器,在其中找到h264那一行,可以找到你电脑上支持的软件和硬件编解码器: ```shell jim@DESKTOP-SVP3BEM MINGW64 ~/Desktop $ ffmpeg -codecs DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid ) (encoders: libx264 libx264rgb h264_amf h264_nvenc h264_qsv nvenc nvenc_h264 ) ``` * 其中qsv是intel核心显卡,h264_cuvid和h264_nvenc是N卡专用,h264_amf是A卡专用,libx264是手动安装的264软编码器;注意,即使你电脑上没有独立显卡,可能ffmpeg也提示支持h264_cuvid、h264_nvenc等硬件编码器,但其实这些独立显卡的硬件编解码器用不了,ffmpeg也只是调用了nvcuvid.dll、nvcuda.dll来操作核心显卡的; * 使用ffmpeg -hwaccels命令查看支持的硬件编解码器名称: ```shell jim@DESKTOP-SVP3BEM MINGW64 ~/Desktop $ ffmpeg -hwaccels Hardware acceleration methods: cuda dxva2 qsv d3d11va opencl vulkan ``` * 其中:cuda:N卡编解码器;dxva2:微软统一硬件加速,N卡A卡核显都支持;qsv:因特尔核心显卡;d3d11va:微软统一硬件加速,N卡A卡核显都支持;opencl:开源显卡图形处理接口;vulkan:跨平台显卡接口; * ffmpeg、ffplay使用默认方式转码和播放时,都是使用的CPU软编解码器,特别是转码速度慢,要使用硬件编解码器需要手动指定。 * 可以使用如下命令 ffmpeg -hwaccel auto -i in.mp4 out.mp4 自动选择编解码器,但有时不会成功,例如你的电脑上只有核心显卡,使用此命令,可能仍然使用的是软编解码器; * 如果你的电脑上是intel核芯显卡,则可使用 ffmpeg -c:v h264_qsv -i in.mp4 -c:v h264_qsv out.mp4 * 如果是独立N卡,则使用 ffmpeg -c:v h264_cuvid -i in.mp4 -c:v h264_nvenc out.mp4 * ffmpeg使用硬件编解码时是使用了很多底层API,如Intel iHD driver(Intel Media driver)、LibVA-utils、Intel Media SDK、VAAPI;如果你想自行实现硬件编解码器的调用模块还是很复杂的,一般还是建议直接使用ffmpeg。 * 视频硬件编解码VPU模块可以了解intel核芯显卡视频编解码相关的Intel Media SDK接口;N卡的NVENC和NVCUVID编解码SDK;A卡的AMF SDK; * https://gitee.com/lijian0302/Intel-Media-SDK/blob/master/doc/mediasdk-man.md * https://docs.nvidia.com/video-technologies/video-codec-sdk/index.html * https://gitee.com/oxpig/AMF/tree/master/amf/doc * 其它的硬件编解码器VPU还有ARM的Mali-V系列,博通,苹果,三星 ---