【问题标题】:encode video in reverse?反向编码视频?
【发布时间】:2011-02-02 22:49:53
【问题描述】:

有谁知道是否可以使用 ffmpeg 反向编码视频? (所以生成的视频会反向播放?)

我想我可以通过为每一帧生成图像(所以一个标签为 1.jpg、2.jpg 等的图像文件夹),然后编写一个脚本来更改图像名称,然后从这些文件中重新编码 ivdeo .

有人知道更快的方法吗?

这是一个 FLV 视频。

谢谢

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    一个问题是帧速率可能因视频而异,许多答案取决于特定的帧速率(例如“-r 25”表示每秒 25 帧)。如果视频中的帧率不同,会导致反转的音视频不同步。

    你当然可以每次手动调整帧率(你可以通过运行 ffmpeg -i video.mkv 得到帧率,然后寻找 fps 前面的数字,这有时是像 23.98 这样的十进制数)。但是使用一些 bash 代码,您可以轻松提取 fps,将其存储在变量中,然后自动将其传递给程序。

    基于此,我创建了以下 bash 脚本来执行此操作。只需 chmod +x 并运行它./make-reversed-video.sh input.mkv output.mkv。代码如下:

    #!/bin/bash
    #Partially based on https://nhs.io/reverse/, but with some modifications, including automatic extraction of the frame rate.
    
    #Get parameters.
    VIDEO_FILE=$1
    OUTPUT_FILE=$2
    TEMP_FOLDER=$3
    
    echo Using input file: $VIDEO_FILE
    echo Using output file: $OUTPUT_FILE
    
    mkdir /tmp/create_reversed_video
    
    #Get frame rate.
    FRAME_RATE=$(ffmpeg -i "$VIDEO_FILE" 2>&1 | grep -o -P '[0-9\\. ]+fps' | grep -o -P '[0-9\\.]+')
    echo The frame rate is: $FRAME_RATE
    
    #Extract audio from video.
    ffmpeg -i "$VIDEO_FILE" -vn -ac 2 /tmp/create_reversed_video/audio.wav
    
    #Reverse the audio.
    sox -V /tmp/create_reversed_video/audio.wav /tmp/create_reversed_video/backwards.wav reverse
    
    #Extract each video frame as an image.
    ffmpeg -i "$VIDEO_FILE" -an -qscale 1 /tmp/create_reversed_video/%06d.jpg
    
    #Recombine into reversed video.
    ls -1 /tmp/create_reversed_video/*.jpg | sort -r | xargs cat | ffmpeg -framerate $FRAME_RATE -f image2pipe -i - -i /tmp/create_reversed_video/backwards.wav "$OUTPUT_FILE"
    
    #Delete temporary files.
    rm -rf /tmp/create_reversed_video
    

    我已经对其进行了测试,它在我的 Ubuntu 18.04 机器上的大量视频上运行良好(在安装了像 sox 这样的依赖项之后)。请让我知道它是否适用于其他 Linux 发行版和版本。

    【讨论】:

      【解决方案2】:

      不,不可能使用 ffmpeg 反向编码视频而不将其转储到图像然后再返回。有许多在线指南可向您展示如何操作,特别是:

      后者如下:

      转储所有视频帧

      $ ffmpeg -i input.mkv -an -qscale 1 %06d.jpg
      

      转储音频

      $ ffmpeg -i input.mkv -vn -ac 2 audio.wav
      

      反向音频

      $ sox -V audio.wav backwards.wav reverse
      

      以 FFmpeg 作为输入的相反顺序的 Cat 视频帧

      $ cat $(ls -r *jpg) | ffmpeg -f image2pipe -vcodec mjpeg -r 25 -i - -i backwards.wav -vcodec libx264 -vpre slow -crf 20 -threads 0 -acodec flac output.mkv
      

      使用 mencoder 去隔行 PAL dv 并将帧速率从 25 提高到 50,然后通过管道传输到 FFmpeg。

      $ mencoder input.dv -of rawvideo -ofps 50 -ovc raw -vf yadif=3,format=i420 -nosound -really-quiet -o - | ffmpeg -vsync 0 -f rawvideo -s 720x576 -r 50 -pix_fmt yuv420p -i - -vcodec libx264 -vpre slow -crf 20 -threads 0 video.mkv
      

      【讨论】:

      • 干杯,非常有帮助。一个小小的改变——使用$(ls -r *jpg)而不是$(ls -t *jpg)更好(至少对我来说)因为修改时间太粗而无法给出正确的顺序
      • @ChaitanyaChandurkar:取决于设备的强大程度、处理器架构和时钟速度等
      • 对于较新版本的 ffmpeg,您应该在最后一步将 -vpre slow 替换为 -preset slow。
      • 这实际上是不正确的。 FFMPEG 现在有一个reverse 过滤器,以及一个用于音频的areverse 过滤器。
      • 这种方法还是比 ffmpeg 的反向过滤器好,后者缓存了 RAM 中所有未压缩的帧。 33mb 和 2 分钟长的 1080p 视频使用 10gb 内存。
      【解决方案3】:

      我根据 Andrew Stubbs 的回答为此创建了一个脚本

      https://gist.github.com/hfossli/6003302

      可以这样使用

      ./ffmpeg_sox_reverse.sh -i Desktop/input.dv -o test.mp4
      

      【讨论】:

      • 这个脚本对我不起作用。它无法使用mktemp 创建临时目录。
      • 我有 OS X,也许这是一个原因?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多