【问题标题】:Merging video and audio stream, where audio drifts合并视频和音频流,音频漂移
【发布时间】:2015-04-22 13:30:51
【问题描述】:

我想用我的树莓派 b+ 2 录制音频和视频。 我尝试使用一个 ffmpeg 命令来完成此操作,但这很慢。我无法让它正常工作

我有一个树莓派相机模块和一个 Cirrus 声卡。在覆盆子上,我编译了一个支持声卡的新内核。我还在 raspberr 上用 alsa 支持编译了 ffmpeg

~$ ffmpeg
ffmpeg version N-71470-g2db24cf Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.6 (Debian 4.6.3-14+rpi1)
configuration: --arch=armel --target-os=linux --enable-gpl --extra-libs=-lasound --enable-nonfree
  libavutil      54. 22.101 / 54. 22.101
  libavcodec     56. 34.100 / 56. 34.100
  libavformat    56. 30.100 / 56. 30.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 14.100 /  5. 14.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

现在我尝试“同时”录制音频流和视频流 我这样做是在运行一个 shell 脚本

raspivid -t 60000 -vs -w 1280 -h 720 -b 5000000 -fps 25 -o video.h264 &
arecord -Dhw:sndrpiwsp -r 44100 -c 2 -d 60 -f S32_LE audio.aac

我也试过 -r 22050 和 -f S16_LE

当运行它时,它有时会给出一个(我认为)

overrun!!! (at least 1038.725 ms long)

在脚本的末尾,我有两个文件。一个视频和一个音频文件。

现在我想通过使用 ffmpeg 将这两者合并在一起

ffmpeg -i video.h264 -i audio.aac -c:v copy -c:a aac -strict experimental output.mp4

这给出了输出:

ffmpeg version N-71470-g2db24cf Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.6 (Debian 4.6.3-14+rpi1)
configuration: --arch=armel --target-os=linux --enable-gpl --extra-libs=-lasound --enable-nonfree
  libavutil      54. 22.101 / 54. 22.101
  libavcodec     56. 34.100 / 56. 34.100
  libavformat    56. 30.100 / 56. 30.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 14.100 /  5. 14.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, h264, from 'video_1min_3.h264':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p, 1280x720, 25 fps, 25 tbr, 1200k tbn, 50 tbc
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, wav, from 'audio_1min_3.aac':
  Duration: 00:01:00.00, bitrate: 705 kb/s
    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 22050 Hz, 2 channels, s16, 705 kb/s
[mp4 @ 0x3230f20] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to 'output_1min_3.mp4':
  Metadata:
    encoder         : Lavf56.30.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=2-31, 25 fps, 25 tbr, 1200k tbn, 1200k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 22050 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc56.34.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
frame= 1822 fps=310 q=-1.0 Lsize=   33269kB time=00:01:12.84 bitrate=3741.7kbits/s
video:32300kB audio:941kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.086073%

所以最后我有一个文件 output.mp4,它是一部电影,它的音频在开始时是同步的,但会漂移到大约 4 秒的差异。音频在视频之前的位置。

我希望你能帮助我解决这个问题,这样音频就不会消失了。

提前致谢

(我尽量说清楚)

【问题讨论】:

    标签: audio video ffmpeg raspberry-pi


    【解决方案1】:

    我们可以尝试使用 -async 和 -vsync 选项来纠正音频和视频的时间偏移。 例如,我使用以下选项来减少音频中 2 秒的时间延迟。 ./ffmpeg -async 1 -i "weatherinput.mov" -strict -2 -vcodec libx264 -movflags +faststart -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -threads 0 -b:a 128k - pix_fmt yuv420p“天气输出.mp4” 如果需要,除了 ioffset 之外,我们还可以使用 vsync 选项。

    下面的链接也可以参考使用 th async、vsync 和 i offset 的其他组合以避免漂移。

    【讨论】:

    • 这是一个固定的不同步时间。我的意思是,如果音频始终保持相同 x 秒,或者这是否补偿了逐渐变差的漂移?
    • 就我而言,我使用了持续时间恒定的漂移。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多