zoukankan      html  css  js  c++  java
  • 如何实现视频的快进快退功能(转)

    原贴地址:https://blog.csdn.net/u012635648/article/details/76079415

    ======================================================

    最近在研究视频的播放的快进快退功能,先把相关的调研结果整理一下,做个记录。

    裸的H264码流,如果实现快进快退必须基于 I 帧才能实现:在播放前对整个码流进行统计,总共有多少帧,所有的 I 帧在什么位置。

    在播放的时候,再根据用户快进或快退的位置判断相邻最近的 I 帧在什么位置,然后从那一个 I 帧开始解码播放。


    H.264 要准确确定 I 帧比较麻烦。一个相对有效的方法是:对 slice 头中的 first_mb_in_slice 和 slice_type 语法元素进行解析,以此来判断是否 I 帧。

    无论哪个播放器要想实现快进快退都只有按照上述方法来做。暴风影音也不例外。

    如果一个视频序列中只有第一帧是 I 帧,那么是根本无法实现快进快退的,暴风影音也不可能做到,不信你可以用暴风影音试试我附件里的这个裸流.

    ffmpeg 提供了一个speed up/down的功能filter:

    Speeding up/slowing down video

    You can change the speed of a video stream using the ​setpts video filter. Note that in the following examples, the audio stream is not changed, so it should ideally be disabled with -an.

    To double the speed of the video, you can use:

    ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
    

    The filter works by changing the presentation timestamp (PTS) of each video frame. For example, if there are two succesive frames shown at timestamps 1 and 2, and you want to speed up the video, those timestamps need to become 0.5 and 1, respectively. Thus, we have to multiply them by 0.5.

    Note that this method will drop frames to achieve the desired speed. You can avoid dropped frames by specifying a higher output frame rate than the input. For example, to Go from an input of 4 FPS to one that is sped up to 4x that (16 FPS):

    ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv
    

    To slow down your video, you have to use a multiplier greater than 1:

    ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv
    

    Speeding up/slowing down audio

    You can speed up or slow down audio with the ​atempo audio filter. To double the speed of audio:

    ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
    

    The atempo filter is limited to using values between 0.5 and 2.0 (so it can slow it down to no less than half the original speed, and speed up to no more than double the input). If you need to, you can get around this limitation by stringing multiple atempo filters together. The following with quadruple the audio speed:

    ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
    

    Using a complex filtergraph, you can speed up video and audio at the same time:

    ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
  • 相关阅读:
    高可靠JAVA项目
    C语言JS引擎
    星际争霸,FF反作弊对战平台
    【转】ffluos编译
    〓经典文字武侠游戏 书剑 书剑江湖自由度超高!公益服!〓
    全局解释器锁GIL
    创建多线程Thread
    线程的简述Thread
    进程池的回调函数callback
    进程池的同步与异步用法Pool
  • 原文地址:https://www.cnblogs.com/wainiwann/p/8780830.html
Copyright © 2011-2022 走看看