首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在ffmpeg视频转换中保留元数据

无法在ffmpeg视频转换中保留元数据
EN

Stack Overflow用户
提问于 2013-11-04 00:34:43
回答 2查看 3.8K关注 0票数 2

当我使用ffmpeg/avconv转换视频时,我想保留创建时间元数据。下面是我尝试转换的文件:

代码语言:javascript
复制
$ ffmpeg -i in.avi 
ffmpeg version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:00:59 with gcc 4.6.3
Input #0, avi, from 'in.avi':
  Metadata:
    creation_time   : 2013-08-12 06:59:14
    encoder         : CanonMVI06
  Duration: 00:00:12.26, start: 0.000000, bitrate: 14549 kb/s
    Stream #0.0: Video: mjpeg, yuvj422p, 640x480, 30 tbr, 30 tbn, 30 tbc
    Stream #0.1: Audio: pcm_u8, 11024 Hz, 1 channels, u8, 88 kb/s

first方法中,我运行

代码语言:javascript
复制
$ ffmpeg -i in.avi -vcodec libx264 -acodec libmp3lame -r 30 -map_metadata 0 out.avi

并得到一个输出文件,它没有我想要保留的'creation_date‘元数据:

代码语言:javascript
复制
$ ffmpeg -i out.avi 
ffmpeg version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:00:59 with gcc 4.6.3
[avi @ 0x83ba260] max_analyze_duration reached
Input #0, avi, from 'out.avi':
  Metadata:
    encoder         : Lavf53.21.1
  Duration: 00:00:12.38, start: 0.000000, bitrate: 704 kb/s
    Stream #0.0: Video: h264 (Main), yuv420p, 640x480, 30 fps, 30 tbr, 30 tbn, 60 tbc
    Stream #0.1: Audio: mp3, 11025 Hz, mono, s16, 200 kb/s

我还尝试了another方法

代码语言:javascript
复制
$ ffmpeg -i in.avi -f ffmetadata metadata.txt
$ ffmpeg -i in.avi -f ffmetadata -i metadata.txt -vcodec libx264 -acodec libmp3lame -r 30 out.avi

即使metadata.txt拥有正确的信息,也同样取得了成功:

代码语言:javascript
复制
;FFMETADATA1
creation_time=2013-08-12 06:59:14
encoder=CanonMVI06

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2020-07-16 22:25:02

要同时保留公共创建日期(触摸)和元数据创建日期,请执行以下操作:

代码语言:javascript
复制
#! /bin/bash
shopt -s globstar || exit
for f in **
do
if [[ "$f" =~ \.AVI$ ]] || [[ "$f" =~ \.avi$ ]] ; then
    t="${f%.*}"_compressed.mp4
    tM="${f%.*}"_compressedM.mp4
    txt="${f%.*}".txt
    ffmpeg -i "$f" -c copy -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata "$txt"
    if yes |      ffmpeg -i "$f" -c:v libx264 -crf 20 -c:a aac -strict -2 "$t"; then
        ffmpeg -i "$t" -f ffmetadata -i "$txt" -c copy -map_metadata 1 "$tM" 
        touch -r "$f" "$tM"
        rm -f "$t"
    else
    rm -f "$t"
    echo "Command failed"
    fi
fi
done
票数 1
EN

Stack Overflow用户

发布于 2017-05-01 02:28:11

我最终采用的方法是将时间戳烘焙到文件名中,同时调整压缩视频文件的“上次修改”时间戳。这是我用来批量转换我的视频的脚本:

代码语言:javascript
复制
#!/bin/bash
mkdir -p compressed
for f in *.MP4; do
  avconv -i "$f" -vcodec libx264 -s 1366x768 -crf 26 -acodec libmp3lame -map_metadata 0 "compressed/${f%.*}.mp4"
  touch -r "$f" "compressed/${f%.*}.mp4" # adjust the timestamp
  time=$(date -r ${f} +%Y%m%d)
  mv "compressed/${f%.*}.mp4" "compressed/${time}_${f%.*}.mp4" # add timestamp to the file name
done

大多数来自现代移动设备的视频在文件名中已经有了时间戳,因此您可能希望跳过该步骤

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19755209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档