欢迎来到皮皮网网站!

【进销库源码】【源码接口设计】【mvc深入源码】ffmpeg player源码

时间:2024-12-29 19:55:44 来源:源码搭建教程视频

1.cplayer是源码什么软件
2.如何用Android NDK编译FFmpeg
3.深入剖析-ijkplayer框架音视频开发
4.ffmpeg相关版权
5.Potplayer播放视频时遇到“播放所需的视频解码器是 AVC1“的解决方案
6.potplayer播放不了视频是怎么回事?

ffmpeg player源码

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占用和电量消耗,但确保视频能够播放,并具有更好的适应性。软解与硬解结合使用,根据实际情况合理选择,以实现最佳的视频播放体验。

更多相关资讯请点击【知识】频道>>>