1.cplayer是源码什么软件
2.å¦ä½ç¨Android NDKç¼è¯FFmpeg
3.深入剖析-ijkplayer框架音视频开发
4.ffmpeg相关版权
5.Potplayer播放视频时遇到“播放所需的视频解码器是 AVC1“的解决方案
6.potplayer播放不了视频是怎么回事?
cplayer是什么软件
CPlayer是一款基于FFPyPlayer制作的媒体播放器,精简直观,源码没有其他多余的源码功能,只有播放功能,源码同时支持快进快退、源码循环播放等功能,源码进销库源码你可以将其放到你的源码U盘中随声携带快速进行播放。FFPyPlayer是源码FFmpeg库的一个python绑定,用于播放和写入媒体文件。
警告:
虽然ffpyplayer的源码源代码是在LGPL下授权的,但是在PYPI上的Windows和Linux的ffpyplayer轮子是在GPL下发布的,因为包含的FFmpeg二进制文件是用GPL选项编译的。
如果你想在LGPL下使用它,源码你需要自己用正确的选项编译FFmpeg。
同样,源码轮子也捆绑了openssl来支持在线相机。但是源码,并不是每个openssl版本都会发布,所以如果安全问题,建议你自己编译ffpyplayer。
å¦ä½ç¨Android NDKç¼è¯FFmpeg
androidçNDKå¼åéè¦å¨linuxä¸è¿è¡ï¼å 为éè¦æC/C++ç¼åç代ç çæè½å¨armä¸è¿è¡ç.soæ件ï¼è¿å°±éè¦ç¨å°äº¤åç¼è¯ç¯å¢ï¼è交åç¼è¯éè¦å¨linuxç³»ç»ä¸æè½å®æã
å®è£ android-ndkå¼åå ï¼è¿ä¸ªå¼åå å¯ä»¥å¨google android å®ç½ä¸è½½ï¼ éè¿è¿ä¸ªå¼åå çå·¥å ·æè½å°android jni çC/C++ç代ç ç¼è¯æåº
androidåºç¨ç¨åºå¼åç¯å¢ï¼ å æ¬eclipseãjavaã android sdkã adtçã
NDKç¼è¯æ¥éª¤ï¼
ãaï¼éæ© ndk èªå¸¦çä¾å hello-jni ï¼æçä½äºE:\android-ndk-r5\samples\hello-jni( æ ¹æ®å ·ä½çå®è£ ä½ç½®èå® ) ã
ããbï¼è¿è¡ cygwin ï¼è¾å ¥å½ä»¤ cd /cygdrive/e/android-ndk-r5/samples/hello-jni ï¼è¿å ¥å° E:\android-ndk-r5\samples\hello-jni ç®å½ã
ããcï¼è¾å ¥ $NDK/ndk-build ï¼æ§è¡æååï¼å®ä¼èªå¨çæä¸ä¸ª libs ç®å½ï¼æç¼è¯çæç .so æ件æ¾å¨éé¢ã ($NDKæ¯è°ç¨æ们ä¹åé 置好çç¯å¢åéï¼ ndk-build æ¯è°ç¨ ndk çç¼è¯ç¨åº )
ããdï¼æ¤æ¶å» hello-jni ç libs ç®å½ä¸çæ没æçæç .so æ件ï¼å¦ææï¼ndk å°±è¿è¡æ£å¸¸å¦ã
深入剖析-ijkplayer框架音视频开发
随着互联网技术的源码迅猛发展,移动设备上的源码视频播放需求日益增长,催生了一系列开源和闭源播放器。源码这些播放器的功能虽然强大,兼容性也颇优,但其基本模块通常包括事务处理、数据接收和解复用、音视频解码以及渲染。以下是一个简化的基本框架图。
在众多播放器项目中,我们选择了ijkplayer进行源码分析。ijkplayer是一款基于FFPlay的轻量级Android/iOS视频播放器,支持跨平台,API易于集成,编译配置可裁剪,方便控制安装包大小。本文基于ijkplayer的k0.7.6版本,重点分析其C语言实现的源码接口设计核心代码,以iOS平台为例,Android平台实现类似,具体请读者自行研究。
ijkplayer的主要目录结构如下:tool(初始化项目工程脚本)、config(编译ffmpeg使用的配置文件)、extra(存放编译ijkplayer所需的依赖源文件,如ffmpeg、openssl等)、ijkmedia(核心代码)、ijkplayer(播放器数据下载及解码相关)、ijksdl(音视频数据渲染相关)、ios(iOS平台上的上层接口封装以及平台相关方法)、android(android平台上的上层接口封装以及平台相关方法)。iOS和Android平台在功能实现上的主要差异在于视频硬件解码和音视频渲染。
ijkplayer的初始化流程包括创建播放器对象,打开ijkplayer/ios/IJKMediaDemo/IJKMediaDemo.xcodeproj工程,在IJKMoviePlayerViewController类中viewDidLoad方法中创建了IJKFFMoviePlayerController对象,即iOS平台上的播放器对象。
ijkplayer的初始化方法具体实现如下:创建了IjkMediaPlayer结构体实例_mediaPlayer,主要完成了以下三个动作:创建平台相关的IJKFF_Pipeline对象,包括视频解码以及音频输出部分;至此,ijkplayer播放器初始化的相关流程已经完成。
ijkplayer实际上是基于ffplay.c实现的,本章节将以该文件为主线,从数据接收、音视频解码、音视频渲染及同步这三大方面进行讲解,要求读者具备基本的ffmpeg知识。
当外部调用prepareToPlay启动播放后,mvc深入源码ijkplayer内部最终会调用到ffplay.c中的stream_open方法,该方法是启动播放器的入口函数,在此会设置player选项,打开audio output,最重要的是调用stream_open方法。
从代码中可以看出,stream_open主要做了以下几件事情:创建上下文结构体,设置中断函数,打开文件,探测媒体类型,打开视频、音频解码器,读取媒体数据,将音视频数据分别送入相应的queue中,重复读取和送入数据步骤。
ijkplayer在视频解码上支持软解和硬解两种方式,可在播放前配置优先使用的解码方式,播放过程中不可切换。iOS平台上硬解使用VideoToolbox,Android平台上使用MediaCodec。ijkplayer中的音频解码只支持软解,暂不支持硬解。
ijkplayer中Android平台使用OpenSL ES或AudioTrack输出音频,iOS平台使用AudioQueue输出音频。audio output节点在ffp_prepare_async_l方法中被创建。
iOS平台上采用OpenGL渲染解码后的YUV图像,渲染线程为video_refresh_thread,最后渲染图像的方法为video_image_display2。
对于播放器来说,blockly源码详解音视频同步是一个关键点,同时也是一个难点。通常音视频同步的解决方案就是选择一个参考时钟,播放时读取音视频帧上的时间戳,同时参考当前时钟参考时钟上的时间来安排播放。
ijkplayer支持的事件比较多,具体定义在ijkplayer/ijkmedia/ijkplayer/ff_ffmsg.h中。在播放器底层上报事件时,实际上就是将待发送的消息放入消息队列,另外有一个线程会不断从队列中取出消息,上报给外部。
本文只是粗略的分析了ijkplayer的关键代码部分,平台相关的解码、渲染以及用户事务处理部分,都没有具体分析到,大家可以参考代码自行分析。
ffmpeg相关版权
FFmpeg是一个被广泛应用于众多开源项目的工具,如ffmpeg2theora、VLC、MPlayer、HandBrake、Blender和Google Chrome等。DirectShow/VFW的ffdshow和QuickTime的Perian也是FFmpeg的外部项目。 FFmpeg的核心部分遵循LGPL和GPL协议,这意味着任何人都可以自由使用,但当使用了GPL模块时,必须遵守相应的开源条款。然而,尽管FFmpeg代码被广泛应用,源码管理推荐仍有一些播放软件,如年加入的暴风影音、QQ影音、KMP、GOM Player以及PotPlayer(从年起),它们在使用FFmpeg的同时并未严格遵守LGPL/GPL协议,未能公开源代码,这种行为令人深感遗憾。 年,韩国软件KMPlayer因未公开使用FFmpeg的代码和二进制文件的详细信息而被曝光,列入FFmpeg耻辱黑名单。同年,网友cehoyos在暴风影音的安装程序中发现了大量开源和私有解码器,如avcodec、avformat等,这促使暴风影音正式被列入黑名单。 年月,roo_zhou向FFmpeg举报QQ影音的credit信息存在问题。尽管声称是LGPL许可证,但实际上,QQ影音修改了ffdshow,使用的是GPL许可证,因此也加入了FFmpeg的耻辱名单。目前,FFmpeg官网的耻辱柱已暂停更新,但其继任者Libav官网仍在继续追踪并公开此类侵权行为。扩展资料
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。Potplayer播放视频时遇到“播放所需的视频解码器是 AVC1“的解决方案
解决Potplayer播放视频时“播放所需的视频解码器是 AVC1”问题的详细步骤
当您在使用Potplayer播放视频时,可能遇到过那个恼人的错误信息:“播放所需的视频解码器是 AVC1”。别担心,这个小问题其实只需要几个简单的步骤就能迎刃而解。让我们一步步来看如何处理:首先,找到左上角Potplayer的菜单栏,点击它以展开更多的选项。
在下拉菜单中,找到并选择“滤镜”-“滤镜/解码器管理”。这一步是关键,因为它将帮助您配置合适的解码器。
在弹出的界面中,切换到“源滤镜/分离器”页签。您会注意到默认的MP4/MOV选项可能是内置的MP4源滤镜/分离器。这里需要更改,所以找到并将其更改为“FFmpeg MP4源滤镜/分离器”。记得保存设置。
完成上述设置后,关闭并重新打开您之前无法播放的视频文件。此时,Potplayer应该能识别并顺利播放了。
请注意,FFmpeg是一个广泛使用的开源库,它提供了对多种视频格式的解码支持,包括常见的MP4格式。通过这个简单的调整,Potplayer就能识别并流畅播放您的视频了。如果问题依然存在,可能是文件编码或格式问题,可以尝试检查一下文件的完整性和兼容性。 总之,遵循上述步骤,您就能轻松解决Potplayer播放MP4视频时的“AVC1解码器”问题,享受流畅的观影体验了。如果还有其他疑问或遇到其他格式的视频问题,记得查阅Potplayer的帮助文档或者在线社区,那里有更多专业的解决方案。potplayer播放不了视频是怎么回事?
1. 当您在Potplayer中尝试播放视频时,遇到“播放所需的视频解码器是 AVC1”的错误信息,可以通过以下步骤进行解决。
2. 首先,在Potplayer的菜单栏中找到并点击“滤镜”选项,然后选择“滤镜/解码器管理”以打开解码器设置。
3. 在弹出的窗口中,切换到“源滤镜/分离器”标签页。
4. 您会看到默认的MP4/MOV源滤镜/分离器可能是内置的。需要将其更改为“FFmpeg MP4源滤镜/分离器”。
5. 更改后,确保保存您的设置。
6. 关闭Potplayer并重新打开您遇到问题的视频文件。此时,视频应该能够顺利播放。
7. FFmpeg是一个广泛使用且开源的库,提供了对多种视频格式的解码支持,包括MP4格式。
8. 如果问题仍然存在,可能是因为视频文件的编码或格式问题。您可以检查文件的完整性和兼容性。
9. 遵循上述步骤,您应该能够解决Potplayer在播放MP4视频时遇到的“AVC1解码器”问题,并享受流畅的播放体验。
. 如有其他疑问或遇到不同格式的视频问题,可查阅Potplayer的帮助文档或在线社区以获取更多专业解决方案。
FFmpegå·¥å ·
ffmpegå¨åé³è§é¢ç¼è§£ç æ¶é常æ¹ä¾¿ï¼æ以å¾å¤åºæ¯ä¸è½¬ç 使ç¨çæ¯ffmpegï¼éè¿ffmpeg â-helpå¯ä»¥çå°ffmpeg常è§çå½ä»¤å¤§æ¦å为å é¨åï¼å½ä»¤æ ¼å¼å¦ä¸ï¼
ä¸é¢ç½åä¸äºffmpeg常ç¨çä¿¡æ¯æ¥è¯¢å½ä»¤ï¼
1ãæ¥è¯¢çæ¬ä¿¡æ¯
2ãffmpegæ¥è¯¢æ¯å¦æ¯æ对åºçè§é¢æä»¶æ ¼å¼
使ç¨ffmpeg转åï¼ææ¶åå¯è½ä¼éå°æ æ³è§£æçè§é¢æ件æè æ æ³çæè§é¢æ件ï¼æ¥éæ示ä¸æ¯æçæ对åºçè§é¢æ件ï¼è¿æ¶åå°±éè¦æ¥çå½å使ç¨çffmpegæ¯å¦æ¯æ对åºçè§é¢æä»¶æ ¼å¼ï¼éè¦ä½¿ç¨ffmpeg -formatsåæ°æ¥æ¥ç:
æ ¹æ®ä¸é¢è¾åºçä¿¡æ¯å¯ä»¥çå°ï¼è¾åºçå 容å为3个é¨åï¼å ·ä½å¦ä¸ã
è¾åºä¿¡æ¯ä¸å å«äºä¸é¨åå 容,å ·ä½å¦ä¸ã
è¾åºä¿¡æ¯çå 容å为ååï¼å ·ä½å¦ä¸ã
ä»è¾åºç帮å©ä¿¡æ¯ä¸å¯ä»¥çå°ï¼FLVçmuxerçä¿¡æ¯å å«ä¸¤å¤§é¨åï¼å ·ä½å¦ä¸ã
ä»è¾åºç帮å©ä¿¡æ¯å¯ä»¥çå°ï¼FLVçdemuxerçä¿¡æ¯å å«ä¸¤å¤§é¨åï¼
ä»å¸®å©ä¿¡æ¯å¯ä»¥çå°ï¼H.(AVC)çç¼ç åæ°å å«ä¸¤å¤§é¨åï¼å ·ä½å¦ä¸ã
ä»å¸®å©ä¿¡æ¯å¯ä»¥çå°ï¼H.(AVC)ç解ç åæ°æ¥çå æ¬ä¸¤å¤§é¨åï¼å ·ä½å¦ä¸ï¼
ä»å¸®å©ä¿¡æ¯å¯ä»¥çå°ï¼colorkey滤éæ¥çä¿¡æ¯å å«ä¸¤å¤§é¨åï¼å ·ä½å¦ä¸ã
ffmpegçå°è£ 转æ¢ï¼è½¬å°è£ ï¼åè½å å«å¨AVFormat模åä¸ï¼éè¿libavformatåºè¿è¡MuxåDemuxæä½ï¼å¤åªä½æ件çæ ¼å¼æå¾å¤ç§ï¼è¿äºæ ¼å¼ä¸çå¾å¤åæ°å¨Muxä¸Demuxçæä½åæ°ä¸æ¯å ¬ç¨çï¼ä¸é¢æ¥è¯¦ç»ä»ç»ä¸ä¸è¿äºå ¬ç¨çåæ°ã
éè¿æ¥çffmpeg --help fullä¿¡æ¯ï¼æ¾å°AVFormatContextåæ°é¨åï¼è¯¥åæ°ä¸çææåæ°å为å°è£ 转æ¢å¯ä½¿ç¨çåæ°ãä¸è¡¨ååºäºffmpeg AVFormatContextç主è¦åæ°å说æã
è¿äºé½æ¯éç¨çå°è£ ã解å°è£ æä½æ¶ä½¿ç¨çåæ°ï¼åç»ç« èä¸ä»ç»è½¬å°è£ æä½ã解å°è£ æä½ãå°è£ æä½æ¶ï¼ä¸è¿°åæ°å¯ä»¥ä¸å¯¹åºçå½ä»¤è¡åæ°æé 使ç¨ã
ffmpegç¼è§£ç é¨åçåè½ä¸»è¦æ¯éè¿æ¨¡åAVCodecæ¥å®æçï¼éè¿libavcodecåºè¿è¡Encodeä¸Decodeæä½ãå¤åªä½ç¼ç æ ¼å¼çç§ç±»æå¾å¤ï¼ä½æ¯è¿æ¯æå¾å¤éç¨çåºæ¬æä½åæ°è®¾ç½®ï¼ä¸é¢æ¥è¯¦ç»ä»ç»è¿äºå ¬ç¨çåæ°ã
éè¿å½ä»¤ffmpeg --help fullå¯ä»¥çå°AVCodecContextåæ°å表信æ¯ã该é项ä¸é¢çææåæ°å为ç¼è§£ç å¯ä»¥ä½¿ç¨çåæ°ã
ffmpegè¿æä¸äºæ´ç»åçåæ°ï¼æ¬èä¸å¹¶æªè¯¦ç»æåï¼å¯ä»¥æ ¹æ®æ¬èä¸æå°çæ¥çæ¹æ³æ¥çffmpegç帮å©æ件以æ¥çæ´å¤çå 容ï¼æ¬èä¸ä»ç»çæ¯éç¹å常ç¨çéç¨åæ°ï¼åç»ç« èä¸ä»ç»ç¼ç æä½æ¶ï¼ä¸è¿°åæ°å¯ä»¥é å对åºçä¾å使ç¨ã
ffmpegå·¥å ·ç主è¦ç¨é为ç¼ç ã解ç ã转ç 以ååªä½æ ¼å¼è½¬æ¢ï¼ffmpeg常ç¨äºè¿è¡è½¬ç æä½ï¼ä½¿ç¨ffmpeg转ç ç主è¦åçå¦å¾
éè¿ä¹åä»ç»çåæ°ï¼å¯ä»¥è®¾ç½®è½¬ç çç¸å ³åæ°ï¼å¦æ转ç æä½é¢æ¶åå°è£ çæ¹åï¼åå¯ä»¥éè¿è®¾ç½®AVCodecä¸AVFormatçæä½åæ°è¿è¡å°è£ ä¸ç¼ç çæ¹åï¼ä¸é¢ç¤ºä¾ï¼
ä»è¾åºä¿¡æ¯ä¸å¯ä»¥çå°ï¼ä»¥ä¸è¾åºçåæ°ä¸ä½¿ç¨äºåé¢ä»ç»è¿çåæ°ï¼å ·ä½å¦ä¸ã
å¨ FFmpegå¥ä»¶ä¸ï¼é¤äºffmpegä½ä¸ºå¤åªä½å¤çå·¥å ·ä¹å¤ï¼è¿æffprobeå¤åªä½ä¿¡æ¯æ¥çå·¥å ·ï¼ffprobe主è¦ç¨æ¥æ¥çå¤åªä½æ件çä¿¡æ¯ï¼ä¸é¢å°±æ¥çä¸ä¸ffprobeä¸å¸¸è§çåºæ¬å½ä»¤ã
usage: ffprobe [OPTIONS] [INPUT_FILE] the other
ffprobe常ç¨çåæ°æ¯è¾å¤ï¼å¯ä»¥éè¿ffprobe --helpæ¥æ¥ç详ç»ç帮å©ä¿¡æ¯ã
è¿äºè¾åºç帮å©ä¿¡æ¯æ¢æ¯ffprobe常ç¨çæä½åæ°ï¼ä¹æ¯ffrpobeçåºç¡åæ°ãä¾å¦æ¥çlogï¼æ¥çæ¯ä¸ä¸ªé³é¢æ°æ®å ä¿¡æ¯æè è§é¢æ°æ®å ä¿¡æ¯ï¼æ¥çèç®ä¿¡æ¯ï¼æ¥çæµä¿¡æ¯ï¼æ¥çæ¯ä¸ä¸ªæµæå¤å°å¸§ä»¥åæ¯ä¸ä¸ªæµæå¤å°ä¸ªé³è§é¢å ï¼æ¥çè§é¢åç´ ç¹çæ ¼å¼çãä¸é¢å°±æ¥æ ¹æ®ä»¥ä¸çè¾åºåæ°éç¹å举å 个ä¾åã
1)使ç¨ä¸é¢çå½ä»¤ï¼æ¥çå¤åªä½æ°æ®å ä¿¡æ¯ï¼
éè¿show_packetsæ¥ççå¤åªä½æ°æ®å ä¿¡æ¯ä½¿ç¨PACKETæ ç¾æ¬èµ·æ¥ï¼å ¶ä¸å å«çä¿¡æ¯ä¸»è¦å¦ä¸ï¼
2)é¤äºä»¥ä¸å段åä¿¡æ¯ä¹å¤ï¼è¿å¯ä»¥éè¿å¦ä¸çç»ååæ°æ¥æ¥çå ä¸çå ·ä½æ°æ®ï¼
åä¸é¢çæ¯èµ·æ¥å¤äºä¸ä¸ªdataå段ï¼å ·ä½å¦ä¸
[PACKET]
codec_type=video
stream_index=0
pts=
pts_time=.
dts=
dts_time=.
duration=
duration_time=0.
size=
pos=
flags=__
data=
: d6 a cc 3ffa ....A..!?.X..1..
: d7e7 b c5 e0f8 1abc 0e4f ...A..'...Qu...O
: d f a2e5 ce 9c ....2$.....~.0..
ç¥è¿ä¸å¤§æ®µæ°æ®
: 1ebe a 5ac2 4f9a c 8eab fef8 ....Z.O.aLV.....
: 0b cc6d 8a4b f8c0 e8 e f .Y.G.m.K....y..I
: 2aca ec e1f5 d2e5 b1 e e *.."....1...w%.'
a0: c5f4 fb f 3fab 6a3d ..pQ.{ .Id.?.j=9.
b0: d9e4 bdd6 0f fa 2b f5 f4f7 .....".w+...S.
c0: 1c9d fe ba c d5 aef5 ...r.P.A.tP1....
d0: f1b9 a7 ad f ..w..T....
[/PACKET]
ä»è¾åºçå 容ä¸å¯ä»¥çå°å¤åªä½å ä¸å å«çæ°æ®ï¼é£ä¹æ们å¯ä»¥æ ¹æ®ä¸è¿°è¾åºå 容ä¸çposï¼ä¹å°±æ¯æ件å移ä½ç½®æ¥æ¥çï¼posçå¼ä¸ºï¼å°å ¶è½¬æ¢ä¸ºåå è¿å¶ä½ç½®ä¸º0xEFï¼è¿å°±æ¯è¿ä¸ªå å¨flvæ件ä¸çå移éï¼å¯ä»¥ä½¿ç¨Linuxä¸çxxd 1.mp4å½ä»¤è¿è¡æ¥ç:
ef: e d6 a cc 3ffa ........A..!?.X.
ef: d7e7 b c5 e0f8 .1.....A..'...Qu
ef: 1abc 0e4f d f a2e5 ce
efa0: 9c a b7 f fb c a9 .0..8.......6,..
efb0: 8f e e d2 a3 e . .2..gs.^x.....
efc0: f3b3 9d2d ffd7 b f 3d bc7f ...-...."3.?=B..
å¯ä»¥çå°ä»0xEFå¼å§çæ°æ®åä¸é¢ä¸è´ï¼ d6 a cc 3ffa ã
éè¿ffprobe读åpacketsæ¥è¿è¡å¯¹åºçæ°æ®åæï¼ä½¿ç¨show_packetsä¸show_dataé åå¯ä»¥è¿è¡æ´å 精确çåæã
3)é¤äºpacketsä¸dataä¹å¤ï¼ffprobeè¿å¯ä»¥åæå¤åªä½çå°è£ æ ¼å¼ï¼å ¶ä½¿ç¨FORMATæ ç¾æ¬èµ·æ¥æ¾ç¤ºï¼
[FORMAT]
filename=1.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.
duration=.
size=
bit_rate=
probe_score=
TAG:major_brand=isom
TAG:minor_version=
TAG:compatible_brands=isomiso2avc1mp
TAG:encoder=Lavf..
[/FORMAT]
ä¸é¢æ¯å¯¹è¾åºä¿¡æ¯å ³é®å段ç说æï¼
4)使ç¨ä¸é¢çå½ä»¤å¯ä»¥æ¥çè§é¢æ件ç帧信æ¯ï¼è¾åºç帧信æ¯å°ä½¿ç¨FRAMEæ ç¾æ¬èµ·æ¥ï¼
[FRAME]
media_type=video
stream_index=0
key_frame=1
pts=0
pts_time=0.
pkt_dts=0
pkt_dts_time=0.
best_effort_timestamp=0
best_effort_timestamp_time=0.
pkt_duration=
pkt_duration_time=0.
pkt_pos=
pkt_size=
width=
height=
pix_fmt=yuvp
sample_aspect_ratio=N/A
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=tv
color_space=bt
color_primaries=bt
color_transfer=bt
chroma_location=left
[/FRAME]
éè¿-show-framesåæ°å¯ä»¥æ¥çæ¯ä¸å¸§çä¿¡æ¯ï¼ä¸é¢å°±æ¥ä»ç»ä¸ä¸å ¶ä¸éè¦çä¿¡æ¯ï¼
å¨Windowsä¸å¸¸ç¨çElecard StreamEyeå·¥å ·ä¸æå¼æ¥çMP4æ¶ï¼ä¼å¾ç´è§å°çå°å¸§ç±»åæ¾ç¤ºï¼ç¨ffprobeçpict_typeåæ ·å¯ä»¥çå°è§é¢ç帧æ¯I帧ï¼P帧æè B帧ï¼æ¯ä¸å¸§ç大å°åæ ·ä¹å¯ä»¥éè¿ffprobeçpkt_sizeæ¥çå°ã
5)éè¿-show_streamsåæ°å¯ä»¥æ¥çå°å¤åªä½æ件ä¸çæµä¿¡æ¯ï¼æµçä¿¡æ¯å°ä½¿ç¨STREAMæ ç¾æ¬èµ·æ¥ï¼
[STREAM]
index=0
codec_name=h
codec_long_name=H. / AVC / MPEG-4 AVC / MPEG-4 part
profile=Main
codec_type=video
codec_tag_string=avc1
codec_tag=0x
width=
height=
coded_width=
coded_height=
closed_captions=0
film_grain=0
has_b_frames=0
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuvp
level=
color_range=tv
color_space=bt
color_transfer=bt
color_primaries=bt
chroma_location=left
field_order=progressive
refs=1
is_avc=true
nal_length_size=4
id=0x1
r_frame_rate=/1
avg_frame_rate=/1
time_base=1/
start_pts=0
start_time=0.
duration_ts=
duration=.
bit_rate=
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:language=und
TAG:handler_name=VideoHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]
å¦ä»¥ä¸è¾åºå 容æ示ï¼ä»ä¸å¯ä»¥çå°æµçä¿¡æ¯ï¼å ·ä½å±æ§å说æå¦ä¸è¡¨
fprobe 使ç¨åé¢çåæ°å¯ä»¥è·å¾key-valueæ ¼å¼çæ¾ç¤ºæ¹å¼ï¼ä½æ¯é 读起æ¥å ä¸ºä¹ æ¯ä¸åï¼å¯è½æç人ä¼è®¤ä¸ºæ¹ä¾¿ï¼æç人认为ä¸æ¹ä¾¿ï¼å¦æè¦è¿è¡æ ¼å¼åçæ¾ç¤ºï¼è¿æ ·å°±éè¦ç¨å°ffprobe -print_format æè ffprobe -of åæ°æ¥è¿è¡ç¸åºçæ ¼å¼è¾åºï¼è-print_format æ¯æå¤ç§æ ¼å¼è¾åºï¼å æ¬XML,INI,JSON,CSV,FLATçãä¸é¢å举å ç§å¸¸è§çæ ¼å¼è¾åºçä¾å
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : isom
minor_version :
compatible_brands: isomiso2avc1mp
encoder : Lavf..
Duration: ::., start: 0., bitrate: kb/s
Stream #0:0 0x1 : Video: h (Main) (avc1 / 0x), yuvp(tv, bt, progressive), x, kb/s, fps, tbr, tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1 0x2 : Audio: aac (LC) (mp4a / 0xD), Hz, stereo, fltp, kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
<streams>
<stream index="0" codec_name="h" codec_long_name="H. / AVC / MPEG-4 AVC / MPEG-4 part " profile="Main" codec_type="video" codec_tag_string="avc1" codec_tag="0x" width="" height="" coded_width="" coded_height="" closed_captions="0" film_grain="0" has_b_frames="0" pix_fmt="yuvp" level="" color_range="tv" color_space="bt" color_transfer="bt" color_primaries="bt" chroma_location="left" field_order="progressive" refs="1" is_avc="true" nal_length_size="4" id="0x1" r_frame_rate="/1" avg_frame_rate="/1" time_base="1/" start_pts="0" start_time="0." duration_ts="" duration="." bit_rate="" bits_per_raw_sample="8" nb_frames="" extradata_size="">
<disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
<tag key="language" value="und"/>
<tag key="handler_name" value="VideoHandler"/>
<tag key="vendor_id" value="[0][0][0][0]"/>
</stream>
<stream index="1" codec_name="aac" codec_long_name="AAC (Advanced Audio Coding)" profile="LC" codec_type="audio" codec_tag_string="mp4a" codec_tag="0xd" sample_fmt="fltp" sample_rate="" channels="2" channel_layout="stereo" bits_per_sample="0" id="0x2" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/" start_pts="0" start_time="0." duration_ts="" duration="." bit_rate="" nb_frames="" extradata_size="2">
<disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
<tag key="language" value="und"/>
<tag key="handler_name" value="SoundHandler"/>
<tag key="vendor_id" value="[0][0][0][0]"/>
</stream>
</streams>
</ffprobe>
ä»è¾åºçå 容å¯ä»¥çå°ï¼è¾åºçå å®¹æ ¼å¼ä¸ºXMLæ ¼å¼ï¼å¦æåæçä¸å¡æ¬èº«å°±å¯ä»¥è§£æXMLæ ¼å¼ï¼é£ä¹å°±ä¸éè¦æ´æ¹è§£æå¼æï¼ç´æ¥å°è¾åºå 容è¾åºä¸ºXMLæ ¼å¼å³å¯ï¼è§£æå¼æ解æPacketä¿¡æ¯æ¯ä¼æ´æ¹ä¾¿ã
è¾åºINIæ ¼å¼ï¼
è¾åºFLATæ ¼å¼ï¼
è¾åºJSONæ ¼å¼ï¼
è¾åºCSVæ ¼å¼ï¼
éè¿åç§æ ¼å¼çè¾åºï¼å¯ä»¥ä½¿ç¨å¯¹åºçç»å¾æ¹å¼ç»å¶åºå¯è§åå¾å½¢ã
CSVæ ¼å¼è¾åºåå¯ä»¥ä½¿ç¨Excelæå¼è¡¨æ ¼å½¢å¼
å¯ä»¥å¨å½ä»¤è¡ä¸èªè¡è¾åºï¼è¾åºçframeä¿¡æ¯å ¨é¨ä¸ºè§é¢ç¸å ³çä¿¡æ¯ã
使ç¨ffprobeè¿å¯ä»¥æ¥çå¾å¤ä¿¡æ¯ï¼æ们å¯ä»¥éè¿æ¬èä»ç»çhelpæ¹æ³æ¥çæ´å¤æ´è¯¦ç»çä¿¡æ¯
å¨FFmpegä¸é常使ç¨ffplayä½ä¸ºææ¾å¨ï¼å ¶å®ffplayåæ ·ä¹å¯ä½ä¸ºå¾å¤é³è§é¢çå¾å½¢ååæå·¥å ·ï¼éè¿ffplayå¯ä»¥çå°è§é¢å¾åçè¿å¨ä¼°è®¡æ¹åãé³é¢æ°æ®ç波形çï¼ä»¥ä¸å°ä»ç»æ´å¤åæ°å¹¶ä¸¾ä¾è¯´æã
1)ffplay常ç¨åæ°
ffplayä¸ä» ä» æ¯ææ¾å¨ï¼åæ¶ä¹æ¯æµè¯ffmpegçcodecå¼æãformatå¼æï¼ä»¥åfilterå¼æçå·¥å ·ï¼å¹¶ä¸è¿å¯ä»¥è¿è¡å¯è§åçåªä½åæ°åæãå ¶å¯ä»¥éè¿ffplay --helpè¿è¡æ¥çï¼
Simple media player
usage: ffplay [options] input_file
Main options:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-dispositions show available stream dispositions
-colors show available color names
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-sources device list sources of the input device
-sinks device list sinks of the output device
-x width force displayed width
-y height force displayed height
-s size set frame size (WxH or abbreviation)
-fs force full screen
-an disable audio
-vn disable video
-sn disable subtitling
-ss pos seek to a given position in seconds
-t duration play "duration" seconds of audio/video
-bytes val seek by bytes 0=off 1=on -1=auto
-seek_interval seconds set seek interval for left/right keys, in seconds
-nodisp disable graphical display
-noborder borderless window
-alwaysontop window always on top
-volume volume set startup volume 0=min =max
-f fmt force format
-window_title window title set window title
-af filter_graph set audio filters
-showmode mode select show mode (0 = video, 1 = waves, 2 = RDFT)
-i input_file read specified file
-codec decoder_name force decoder
-autorotate automatically rotate video
è¿åªæ¯Main optionséé¢çé¨åï¼å¦å¤è¿æAdvanced optionsï¼AVCodecContext AVOptionsççå¾å¤å 容ãå°±ä¸è¿°å¸®å©ä¿¡æ¯çè¾åºæ示ï¼æäºæ¯åé¢å·²ç»ä»ç»è¿çåæ°ï¼è¿éå°±ä¸åä¸ä¸èµè¿°ï¼ä¸äºæªä»ç»çåæ°è¯´æè§ä¸è¡¨
常è§åæ°å¯ä»¥æå¨è¿è¡å°è¯ï¼ä¸é¢å举å 个示ä¾ã
*å¦æå¸æä»è§é¢ç第5ç§å¼å§ææ¾ï¼ææ¾5ç§éçæ件ï¼åå¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤
*å¦æå¸æè§é¢ææ¾æ¶ææ¾å¨ççªå£æ¾ç¤ºæ é¢ä¸ºèªå®ä¹æ é¢ï¼åå¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤
*å¦æå¸æ使ç¨ffplayæå¼ç½ç»ç´ææµï¼åå¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤:
å¯ä»¥çåºffplayå¯ä»¥æ¯æçåè®®æå¤ç§ï¼rampï¼rtmpï¼httpççé½æ¯æã
æ¾ç¤ºå¦ä¸çªå£å 容
ä¸é¢å°è¿äºåæ°ä¸åé¢ä»ç»è¿çä¸äºåæ°è¿è¡ç»åï¼ä¸¾å 个ä¾åã
1⃣️ä»ç§ææ¾ä¸ä¸ªè§é¢ï¼ææ¾æ¶é¿ä¸º5ç§ï¼ææ¾å®æ¯åèªå¨éåºffplayï¼ææ¾å¨ççªå£æ é¢ä¸ºâHello Worldâï¼ä¸ºäºç¡®è®¤ææ¾æ¶é¿æ£ç¡®ï¼å¯ä»¥éè¿ç³»ç»å½ä»¤timeæ¥çå½ä»¤è¿è¡æ¶é¿ï¼
å¯ä»¥çå°è¾åºç»æå¦ä¸ï¼
ffplay -window_title "Hello World" -ss -t 5 -autoexit 1.mp4 0.s user 0.s system % cpu 6. total
2⃣️å¦æ强å¶ä½¿ç¨H.解ç å¨è§£ç MPEG4çè§é¢ï¼å°ä¼æ¥é
æ们è¿ä¸ªè§é¢æ¯hç¼ç ï¼æ以å¯ä»¥æ£å¸¸ææ¾ã
æ¥çè§é¢ç¼ç å¯ä»¥ä½¿ç¨
æ¥çffmpegæ¯æç解ç æ ¼å¼
ä¸é¢è¿ä¸ªæ¹å¼è§£ç å°±ä¼æ¥é
åé¢ä¸¾è¿çä¾åä¸ï¼æ们çå°çæ¯è¾å¤çæ¯åèç®çæµï¼å¤èç®çæµï¼å¸¸ç¨äºå¹¿çµè¡ä¸çè§é¢ãå½è§é¢ä¸åºç°å¤ä¸ªProgramæ¶ï¼ææ¾Programä¸å¸¸è§çææ¾æ¹å¼ææä¸åï¼éè¦æå®å¯¹åºçæµï¼å¯ä»¥éè¿vstï¼astï¼sståæ°æ¥æå®ï¼ä¾å¦å¸æææ¾Program ä¸çé³è§é¢æµï¼è§é¢ç¼å·ä¸º4ï¼é³é¢ç¼å·ä¸º5ï¼åå¯ä»¥éè¿å¦ä¸å½ä»¤è¿è¡å¶å®ï¼
ææ¡ä»¶çæåå¯ä»¥èªå·±æ¾è§é¢æ¥æ¥çã
3⃣️å¦æ使ç¨ffplayææ¾è§é¢æ¶å¸æå è½½åå¹æ件ï¼åå¯ä»¥éè¿å è½½ASSæè SRTåå¹æ件æ¥è§£å³ï¼ä¸é¢å举ä¸ä¸ªå è½½SRTåå¹çä¾åï¼é¦å ç¼è¾SRTåå¹æ件ï¼å 容å¦ä¸ï¼
1
::. --> ::.
è¿æ¯æ ææ¯è°
2
::. --> ::.
æç±ä¸å½
3
::. --> ::.
为人æ°æå¡
4
::. --> ::.
ç«æ æ©æ¥ç»æï¼å½æ³°æ°å®ï¼
ç¶åéè¿filterå°åå¹æ件å è½½å°ææ¾æ°æ®ä¸ï¼ä½¿ç¨å½ä»¤å¦ä¸ï¼
ææ¾çææå¦ä¸ï¼
å¯ä»¥çåºï¼è§é¢ä¸å·²ç»å°SRTæ ¼å¼çæååå¹å å ¥å°è§é¢ä¸å¹¶å±ç°äºåºæ¥ã
2ï¼ffplayçæ°æ®å¯è§ååæåºç¨
使ç¨ffplayé¤äºå¯ä»¥ææ¾è§é¢æµåªä½æ件ä¹å¤ï¼è¿å¯ä»¥ä½ä¸ºå¯è§åçè§é¢æµåªä½åæå·¥å ·ï¼ä¾å¦ææ¾é³é¢æ件æ¶ï¼å¦æä¸ç¡®å®æ件ç声é³æ¯å¦æ£å¸¸ï¼åå¯ä»¥ç´æ¥ä½¿ç¨ffplayææ¾é³é¢æ件ï¼ææ¾çæ¶åå ¶å°ä¼æ解ç åçé³é¢æ°æ®ä»¥é³é¢æ³¢å½¢çå½¢å¼æ¾ç¤ºåºæ¥ï¼
å½ä»¤è¡æ§è¡åçææå¦ä¸ï¼
ä»å¾ä¸å¯ä»¥çå°ï¼é³é¢ææ¾æ¶ç波形å¯ä»¥éè¿æ¯å¹ æ¾ç¤ºåºæ¥ï¼å¯ä»¥ç¨æ¥æ¥çé³é¢çææ¾æ åµã
å½ææ¾è§é¢æ¶æ³è¦ä½éªè§£ç å¨æ¯å¦ä½è§£ç æ¯ä¸ªå®åçï¼å¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤
æ°çFFmpegæ¤æ¹æ³å·²ç»ä¸åæ¯æå¦ï¼å¯åè
https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors
æ们å¯ä»¥ä½¿ç¨ffmpegæè ffplayæ¥åæè§é¢æ件ä¸çè¿å¨åéãffmpegçæ©æçæ¬ï¼å¹´æä¹åï¼ä¹å 许åæå®åï¼ä½æ¤é项已被å é¤ã
'codecview'è¿æ»¤å¨å¯ç¨äºå°è¿å¨åéæ¾ç¤ºä¸ºæ¯ä¸ªå®åçå°ç®å¤´ãå®éç¨ä¸ä¸ªå«mvçé项ï¼å®æå®äºè¦ç»å¶çè¿å¨åéçç±»åï¼
ä½ å¯ä»¥ä½¿ç¨å¦ä¸çå½ä»¤
第ä¸æ¡å½ä»¤æ¯ç´æ¥ç¨ffplayæ¾ç¤ºè§é¢ã
第äºæ¡å½ä»¤æ¯æçæç带æè¿å¨åéçè§é¢ä¿åå°output.mp4ä¸ã
æ¾ç¤ºææå¦ä¸ï¼
关于软解(ffmpeg)和硬解(MediaCodec、MediaPlayer)以及底层(OpenMax)的那点事
硬解与软解在视频播放中的区别主要体现在解码方式和性能表现上。硬解编码是指将部分视频数据交由GPU处理,相较于软解,硬解在效率、功耗和发热方面具有明显优势,但因起步较晚,软件和驱动支持度较低,且在滤镜、字幕、画质处理方面表现欠佳。软解编码通过CPU进行大量视频信息运算,对处理性能要求高,可能导致转换效率低下、发热量大,但软解无需过多硬件支持,兼容性高,且具备丰富的滤镜、字幕和画面优化效果。CPU性能强劲时,软解可以实现更出色的画面效果。
FFmpeg是一个常见的视频软解码开源库,支持多种格式,如B站的ijkplayer就是基于FFmpeg的开源播放器。ijkplayer的开源地址在github上。使用FFmpeg,可以通过相关接口实现视频推荐、学习和资源获取。
MediaCodec是Android系统自带的视频编解码接口,利用硬件解码,效率相对FFmpeg更高,Google的ExoPlayer就是基于MediaCodec的代表播放器。ExoPlayer的开源地址同样在github上。MediaCodec接口包括一系列用于创建和管理解码器的方法,如createDecoderByType,实现播放过程。通过ExoPlayer的官方文档和社区资源,可以找到实现MediaCodec播放的示例代码。
OpenMax是一个多媒体应用程序框架标准,用于实现跨平台的编解码器和应用程序便携化。Android的多媒体引擎OpenCore和StageFright可以利用OpenMax作为插件,主要用于编解码处理。硬件厂商通过加载libstagefrighthw.so实现硬解码插件,以支持特定的硬件设备。
MediaPlayer是Android系统中的多媒体播放类,支持音视频流或本地音视频资源的播放。MediaPlayer通过Binder通信,最终调用MediaPlayerService进行底层实现。厂商可以自定义播放器并注入到Android框架中,实现特定的播放需求。例如,海思(Hi3)提供的HiMediaPlayerManage作为播放器的具体实现,对接Android标准的MediaPlayer接口,并通过工厂模式实现播放器创建和选择。
在Android设备硬件支持的情况下,优先选择使用硬件解码,以降低CPU负载、节省电量。在硬件解码不支持的场景下,使用软解码,虽然会增加CPU占用和电量消耗,但确保视频能够播放,并具有更好的适应性。软解与硬解结合使用,根据实际情况合理选择,以实现最佳的视频播放体验。