Как экспортировать аудио из видеофайла iPhone с помощью FFmpeg? - PullRequest
0 голосов
/ 11 января 2020

ОБНОВЛЕНИЕ 1 проблема находится во входном потоке чтения. (проверьте ниже)

Я использую fluent-ffmpeg (версия: 2.1.2), чтобы извлечь файл .mp3 из видеофайла, который я ввел в виде потока .createReadStream (). Я вывожу файл как .pipe в remoteWriteStream.

ffmpeg -i pipe:0 -vn -f mp3 -acodec mp3 -movflags frag_keyframe+empty_moov pipe:1

Это прекрасно работает с файлами .mp4, .webm и .mov (код c: prores).

Но он почему-то не хочет работать с .mov из iPhone 11. FFmpeg не выдает никаких ошибок при работе над кодом. Он создает файл .mp3, но его размер составляет всего 152 Б, и он не воспроизводится.

Я обнаружил файлы iPhone .mov, которые он возвращает:

"{ streams: 
   [ { index: 0,
       codec_name: 'hevc',
       codec_long_name: 'H.265 / HEVC (High Efficiency Video Coding)',
       profile: 'Main',
       codec_type: 'video',
       codec_time_base: '1111/33300',
       codec_tag_string: 'hvc1',
       codec_tag: '0x31637668',
       width: 1920,
       height: 1080,
       coded_width: 1920,
       coded_height: 1088,
       has_b_frames: 2,
       sample_aspect_ratio: '0:1',
       display_aspect_ratio: '0:1',
       pix_fmt: 'yuv420p',
       level: 120,
       color_range: 'tv',
       color_space: 'bt709',
       color_transfer: 'bt709',
       color_primaries: 'bt709',
       chroma_location: 'unspecified',
       field_order: 'unknown',
       timecode: 'N/A',
       refs: 1,
       id: 'N/A',
       r_frame_rate: '30000/1001',
       avg_frame_rate: '33300/1111',
       time_base: '1/600',
       start_pts: 'N/A',
       start_time: 'N/A',
       duration_ts: 6666,
       duration: 11.11,
       bit_rate: 7611708,
       max_bit_rate: 'N/A',
       bits_per_raw_sample: 'N/A',
       nb_frames: 333,
       nb_read_frames: 'N/A',
       nb_read_packets: 'N/A',
       tags: [Object],
       disposition: [Object] },
     { index: 1,
       codec_name: 'aac',
       codec_long_name: 'AAC (Advanced Audio Coding)',
       profile: 'unknown',
       codec_type: 'audio',
       codec_time_base: '1/44100',
       codec_tag_string: 'mp4a',
       codec_tag: '0x6134706d',
       sample_fmt: 'fltp',
       sample_rate: 44100,
       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/44100',
       start_pts: 'N/A',
       start_time: 'N/A',
       duration_ts: 489951,
       duration: 11.11,
       bit_rate: 135091,
       max_bit_rate: 192000,
       bits_per_raw_sample: 'N/A',
       nb_frames: 481,
       nb_read_frames: 'N/A',
       nb_read_packets: 'N/A',
       tags: [Object],
       disposition: [Object] },
     { index: 2,
       codec_name: 'unknown',
       codec_long_name: 'unknown',
       profile: 'unknown',
       codec_type: 'data',
       codec_tag_string: 'mebx',
       codec_tag: '0x7862656d',
       id: 'N/A',
       r_frame_rate: '0/0',
       avg_frame_rate: '0/0',
       time_base: '1/600',
       start_pts: 'N/A',
       start_time: 'N/A',
       duration_ts: 6666,
       duration: 11.11,
       bit_rate: 2670,
       max_bit_rate: 'N/A',
       bits_per_raw_sample: 'N/A',
       nb_frames: 38,
       nb_read_frames: 'N/A',
       nb_read_packets: 'N/A',
       tags: [Object],
       disposition: [Object] },
     { index: 3,
       codec_name: 'unknown',
       codec_long_name: 'unknown',
       profile: 'unknown',
       codec_type: 'data',
       codec_tag_string: 'mebx',
       codec_tag: '0x7862656d',
       id: 'N/A',
       r_frame_rate: '0/0',
       avg_frame_rate: '0/0',
       time_base: '1/600',
       start_pts: 'N/A',
       start_time: 'N/A',
       duration_ts: 6666,
       duration: 11.11,
       bit_rate: 7,
       max_bit_rate: 'N/A',
       bits_per_raw_sample: 'N/A',
       nb_frames: 1,
       nb_read_frames: 'N/A',
       nb_read_packets: 'N/A',
       tags: [Object],
       disposition: [Object] },
     { index: 4,
       codec_name: 'unknown',
       codec_long_name: 'unknown',
       profile: 'unknown',
       codec_type: 'data',
       codec_tag_string: 'mebx',
       codec_tag: '0x7862656d',
       id: 'N/A',
       r_frame_rate: '0/0',
       avg_frame_rate: '0/0',
       time_base: '1/600',
       start_pts: 'N/A',
       start_time: 'N/A',
       duration_ts: 6666,
       duration: 11.11,
       bit_rate: 18117,
       max_bit_rate: 'N/A',
       bits_per_raw_sample: 'N/A',
       nb_frames: 333,
       nb_read_frames: 'N/A',
       nb_read_packets: 'N/A',
       tags: [Object],
       disposition: [Object] } ],
  format: 
   { filename: 'pipe:0',
     nb_streams: 5,
     nb_programs: 0,
     format_name: 'mov,mp4,m4a,3gp,3g2,mj2',
     format_long_name: 'QuickTime / MOV',
     start_time: 'N/A',
     duration: 11.11,
     size: 'N/A',
     bit_rate: 'N/A',
     probe_score: 100,
     tags: 
      { major_brand: 'qt  ',
        minor_version: '0',
        compatible_brands: 'qt  ',
        creation_time: '2020-01-11T12:33:36.000000Z',
        'com.apple.quicktime.make': 'Apple',
        'com.apple.quicktime.model': 'iPhone 11',
        'com.apple.quicktime.software': '13.3',
        'com.apple.quicktime.creationdate': '2020-01-11T13:33:36+0100' } },
  chapters: [] }" 

Создано. mp3 файл приводит к неопределенному.

Я уже пытался взять .mov перекодировать его в .mp4 через ffmpeg, а затем попробовать приведенный выше код, чтобы получить .mp3 - все еще не работает.

Любой совет, как я могу сделать эту работу?

спасибо!


ОБНОВЛЕНИЕ 1 Проблема заключается во входном потоке! Когда я загружаю файл на локальный компьютер и вводю его как локальный файл, а не как поток чтения, он отлично работает.

Я создаю поток из облачного хранилища Google следующим образом:

const myBucket = storage.bucket('myBucket');
const remoteReadStream = myBucket.file(file).createReadStream();

Поскольку этот код прекрасно работает со всеми другими кодеками, что может быть проблемой при создании потока чтения из облака Google из файла h265?

...