Получить временный код из MP4, созданный в Adobe Premiere / Encoder на Python и FFMPEG - PullRequest
0 голосов
/ 02 ноября 2019

Я пишу скрипт, который должен конвертировать или повторно упаковывать MP4 в виде MOV с временным кодом.

У меня есть MP4, сгенерированный из Adobe Premiere. Если я верну этот файл обратно в Premiere, у меня будет тайм-код. Я могу видеть это, поэтому я знаю, что это там.

Я не могу извлечь дорожку временного кода из MP4. Я посмотрел всюду в Интернете и нашел некоторые обсуждения вокруг него, но никакого реального успеха в извлечении временного кода не получилось.

Я использовал ffprobe, чтобы увидеть, есть ли упоминание о временном коде в MP4, но не имеяудачи. Я попробовал PyMediaInfo безуспешно.

Вот что показывает ffprobe:


ffprobe version 4.2.1 Copyright (c) 2007-2019 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.8)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.1_1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include/darwin -fno-stack-check' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo_SequenceV3.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2019-11-01T23:34:45.000000Z
  Duration: 00:00:27.69, start: 0.000000, bitrate: 10463 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 2304x1152 [SAR 1:1 DAR 2:1], 10142 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 48k tbc (default)
    Metadata:
      creation_time   : 2019-11-01T23:34:45.000000Z
      handler_name    : ?Mainconcept Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2019-11-01T23:34:46.000000Z
      handler_name    : #Mainconcept MP4 Sound Media Handler
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_time_base=1001/48000
codec_tag_string=avc1
codec_tag=0x31637661
width=2304
height=1152
coded_width=2304
coded_height=1152
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=2:1
pix_fmt=yuv420p
level=50
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=24000/1001
avg_frame_rate=24000/1001
time_base=1/24000
start_pts=0
start_time=0.000000
duration_ts=663663
duration=27.652625
bit_rate=10142082
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=663
nb_read_frames=N/A
nb_read_packets=N/A
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
TAG:creation_time=2019-11-01T23:34:45.000000Z
TAG:language=eng
TAG:handler_name=Mainconcept Video Media Handler
TAG:encoder=AVC Coding
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/48000
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=0
start_time=0.000000
duration_ts=1327326
duration=27.652625
bit_rate=317375
max_bit_rate=335623
bits_per_raw_sample=N/A
nb_frames=1298
nb_read_frames=N/A
nb_read_packets=N/A
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
TAG:creation_time=2019-11-01T23:34:46.000000Z
TAG:language=eng
TAG:handler_name=#Mainconcept MP4 Sound Media Handler
[/STREAM]
[FORMAT]
filename=demo_SequenceV3.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=27.690667
size=36216937
bit_rate=10463290
probe_score=100
TAG:major_brand=mp42
TAG:minor_version=0
TAG:compatible_brands=mp42mp41
TAG:creation_time=2019-11-01T23:34:45.000000Z
[/FORMAT]

И вот что я начал экспериментировать в Python.

from pymediainfo import MediaInfo

media_info = MediaInfo.parse('demo_SequenceV3.mp4')
for track in media_info.tracks:
    if track.bit_rate is not None:
        print ("%s: %s" % (track.track_type, track.bit_rate))
    else:
        print ("""%s tracks do not have bit rate associated with them.""" % track.track_type)

Iзнаю, что я не использую MediaInfo правильно, но я не смог найти никакой документации по временному коду, и, честно говоря, я уверен, что он просто использует систему FFMPEG для поиска дорожки данных, которая, кажется, не существует.

Кто-нибудь здесь знает достаточно об этом, чтобы заставить его работать или указать мне правильное направление?

Цель состоит в том, чтобы повторно обернуть MP4 в MOV и перевести временной код, чтобы онвернулся туда, где он обычно находится на MOV.

РЕДАКТИРОВАТЬ: вот пример MP4, из которого мне нужно извлечь временной код из:

https://www.dropbox.com/s/a1euiumiapkpzhn/timecode_demo.mp4?dl=0

И как выНа этом изображении видно, что MP4 имеет временной код, который считывает Premiere в левом нижнем углу кадра. TC начинается в 10: 11: 12: 13.

https://www.dropbox.com/s/pafqicnnsqu93rl/timecode_window_in_premiere.png

1 Ответ

1 голос
/ 03 ноября 2019

Временной код хранится в специальном формате Adobe (XMP), который ffmpeg обычно не анализирует, и даже когда это происходит, он просто обрабатывает его как необработанный двоичный объект.

Вы можете использовать команду, аналогичнуюодин ниже, чтобы извлечь TC, а затем повторно смешать файл, используя ffmpeg, передав -timecode EXTRACTED_VALUE

ffmpeg -export_xmp true -i timecode_demo.mp4 2>&1 | grep -A 5 -i starttimecode | grep -ioP "(?<=timevalue=\")[0-9:]+" | head -1

Вышеприведенные извлечения

10:11:12:13

Если вы используете Mediainfo API,ищите ключ метаданных TIM, но я не могу проверить, будет ли это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...